Financial terms were not announced, but a source told ESPN's Adam Schefter that the contract is worth $15.5 million.
"It's a dream come true," Bernard said, according to the team's website. "Me going somewhere else did not even sound right. Me not being in that orange, white and black didn't sound right to me."
The extension puts Bernard under contract through the 2019 season.
"It's great to be able to extend our commitment with Gio," coach Marvin Lewis said in a statement. "It's all a part of what I keep saying -- draft the right players, develop them and retain them. We're excited about the great things Gio will continue to add to our offense."
Hill tweeted congratulations to Bernard on Tuesday.
There were calls during the season to start Bernard, who was the more effective receiving threat out of the backfield. Bernard caught 49 passes for 472 yards.
Bernard also rushed for nearly 4.7 yards per carry and didn't fumble in 154 attempts.
But the Bengals kept Hill as the starter other than benching him for the start of the Week 15 game in San Francisco.