Sagan was engaged in a sprint battle with Alexander Kristoff (Katusha) and a finish line photo had to be used to separate the two riders and determine a winner. Sagan's lunge to the line won it for him. Sondre Holst Enger (IAM Cycling) placed third.
There was no fairytale victory for Fabian Cancellara (Trek-Segafredo) in his home town and in his last Tour, but the Swiss powerhouse still put in a dig at the finish to place sixth in a top 10 that resembled that of a spring classic.
The stage finish was contested by a severely diminished lead group after an uphill, cobbled drag into the Swiss city.
Race leader Chris Froome (Sky) finished in that same group as Sagan to safely retain the yellow jersey into Tuesday's rest day. The defending champion leads Dutchman Bauke Mollema (Trek-Segafredo) by 1-47, with Adam Yates (Orica-BikeExchange) in third at 2-45.
The day's escape had possibly the oddest make-up of the Tour so far: Etixx-QuickStep riders Tony Martin and Julian Alaphilippe. The pair rode a two-up time trial after attacking at the 13km mark. Several riders attempted to bridge over to them, but all failed.
As the blue-and-black clad pair made their way along the hot roads on a long 209km stage, the peloton kept them in close check, never really letting them gain more than a handful of minutes. They were caught with 22km to go, which coincided with Etixx sprinter Marcel Kittel losing contact with the peloton on a climb.
Alaphilippe and Martin were jointly awarded the day's combativity award.
Rui Costa (Lampre-Merida) was the next rider to have a go, clipping off the front just before the 20km-to-go marker. The Portuguese former world champion only gained around 15 seconds and was subsequently caught with 2.5km to go.
As the bunch hit the final ascent, Sep Vanmarcke (LottoNL-Jumbo) lunched a move, but was soon caught to set up a hectic bunch gallop with points classification leader Sagan adding yet again to his tally to wear the green jersey.
On Tuesday, the riders enjoy the second rest day of the 2016 Tour de France, stopping off at Bern before the racing heads into the Alps during the final week.
Tour de France 2016, stage 16: Moirans-en-Montagne to Bern, 209km
1. Peter Sagan (Svk) Tinkoff in 4-26-02
2. Alexander Kristoff (Nor) Katusha
3. Sondre Holst Enger (Nor) IAM Cycling
4. John Degenkolb (Ger) Giant-Alpecin
5. Michael Matthews (Aus) Orica-BikeExchange
6. Fabian Cancellara (Sui) Trek-Segafredo
7. Sep Vanmarcke (Bel) LottoNL-Jumbo
8. Maximiliano Richeze (Arg) Etixx-QuickStep
9. Edvald Boasson Hagen (Nor) Dimension Data
10. Greg Van Avermaet (Bel) BMC Racing all same time
13. Chris Froome (GBr) Team Sky
18. Adam Yates (GBr) Orica-BikeExchange
19. Bauke Mollema (Ned) Trek-Segafredo all same time
General classification after stage 16
1. Chris Froome (GBr) Team Sky in 72-40-38
2. Bauke Mollema (Ned) Trek-Segafredo at 1-47
3. Adam Yates (GBr) Orica-BikeExchange at 2-45
4. Nairo Quintana (Col) Movistar at 2-59
5. Alejandro Valverde (Esp) Movistar at 3-17
6. Romain Bardet (Fra) Ag2r La Mondiale at 4-04
7. Richie Porte (Aus) BMC Racing at 4-27
8. Tejay van Garderen (USA) BMC Racing at 4-47
9. Daniel Martin (Irl) Etixx-QuickStep at 5-03
10. Fabio Aru (Ita) Astana at 5-16
Thank you for reading 20 articles this month* Join now for unlimited access
Enjoy your first month for just £1 / $1 / €1
*Read 5 free articles per month without a subscription
Join now for unlimited access
Try first month for just £1 / $1 / €1