Norway's Kristoff (Katusha) celebrated after crossing the line, but it was Slovak Sagan (Tinkoff) who actually finished first after throwing his bike in timely fashion, strengthening his grip on the green jersey for the points classification.
Another Norwegian, Sondre Holst Enger (IAM Cycling), took third place.
"I thought I was second, really," said Sagan, who now has 405 points to Briton Mark Cavendish's 291 and looks set to win a fifth green jersey in Paris.
Briton Chris Froome (Team Sky) retained the overall leader's yellow jersey after finishing in the leading pack in a twisting course finale in the Swiss capital.
"There was never a quiet moment, it's good to have another day ticked off," said Froome, who leads Dutchman Bauke Mollema (Trek-Segafredo) by 1:47 and fellow Briton Adam Yates (Orica-Bike Exchange) by 2:45.
Fans, officials and riders observed a minute's silence at 1200 local time, shortly before the start of the stage, in memory of the victims of the Bastille Day attack in Nice.
Not textbook
Three-time time trial world champion Tony Martin and his Etixx-Quick Step team mate Julian Alaphilippe, who was denied a possible stage win on Sunday because of a mechanical problem in the final descent, broke away early on.
The duo built a six-minute gap but Frenchman Alaphilippe ran out of steam 30km from the finish and German Martin was caught by the bunch 22.5km from the line.
Both finished last, hand-in-hand, 12:20 behind Sagan, although happy they had given it a try.
"It was a bit crazy and careless, but sometimes it's good to try something that's not in the text book," said Martin.
Former world champion Rui Costa then jumped away from the pack but the Portuguese was reined in with 5km left in the streets of Bern.
Numerous turns and an uphill cobbled section split the peloton and Sagan was again the strongest in the final sprint.
Tuesday is a rest day ahead of four stages in the Alps.