Needing to win to be assured of holding off Liverpool, City were in danger of blowing it as Matty Cash and former Reds star Philippe Coutinho struck at the Etihad Stadium.
Yet Pep Guardiola’s side showed all their champion quality to rally with Ilkay Gundogan coming off the bench to score twice either side of a superb Rodri strike in a remarkable five-minute spell.
City had known that second-placed Liverpool, trailing by just a point, could overtake them with victory over Wolves and there were times in the afternoon when they lived on their nerves.
When they trailed by two, Liverpool were being held 1-1 and news of another goal at Anfield at that stage, could have been a hammer blow.
Yet in remarkable final-day drama, City cast off the shackles of a dismal first-half display to turn the game around and render Liverpool’s eventual win academic.
There were few signs of nerves, or the tension to follow, as the game kicked off amid a joyous and raucous atmosphere.
City supporters had given their team a rousing welcome outside the stadium and there was a feeling celebrations were almost getting under way as news filtered through of an early Wolves goal.
City were boosted by the return of John Stones from injury but, with Kyle Walker fit enough only for the bench, he lined up at right-back.
Fernandinho, making his final City appearance, continued in his role as a makeshift centre-back alongside Aymeric Laporte with Joao Cancelo on the left.
It made for an uncomfortable-looking back four, and so it proved, but it was City who made most of the early running.
Cancelo had a couple of efforts blocked after good runs and Gabriel Jesus almost embarrassed debutant Villa goalkeeper Robin Olsen when he charged down a clearance. Phil Foden also rolled a shot narrowly wide after a Kevin De Bruyne counter-attack.
Villa, who were warned about time-wasting early on by referee Michael Oliver, grew into the game and took a shock lead eight minutes before the interval.
Lucas Digne, the former Everton full-back, broke clear down the left and clipped in a fine cross from the byline. Cash, running in from the opposite side, met it with a firm header that Ederson could not keep out.
With Liverpool having now equalised against Wolves, the mood was transformed. City were stunned and suddenly looked vulnerable.
Fernandinho looked particularly shaky as Watkins twice threatened, first having a shot blocked and then being denied by a back-tracking Stones.
The interval came at a good time for City and it was no surprise that Fernandinho did not return for the second half. Oleksandr Zinchenko took his place and the back line was reshaped.
City upped the tempo and Jesus should have equalised when picked out at the back post by Cancelo but volleyed over.
Yet Villa were in stubborn mood and repelled wave after wave of further attacks with captain Tyrone Mings standing tall.
De Bruyne went close with a dipping free-kick but City were caught out by a long clearance upfield by Olsen, which Watkins headed on to Coutinho.
The Brazilian’s first touch was exquisite and completely wrong-footed Laporte, exposing Ederson at the near post. The goal still took some finishing but Coutinho kept his cool and found the bottom corner.
Villa manager Steven Gerrard was more than doing his job for former club Liverpool and this was now a serious test of City’s mettle, but they rallied.
De Bruyne first blasted over before substitutes Raheem Sterling and Gundogan combined to pull one back on 76 minutes. The German had a free header at the back post after being picked out by Sterling and made no mistake.
With their tails now up, City pressed again and moments later levelled as Zinchenko picked out Rodri on the edge of the area and the Spaniard stroked the ball into the bottom corner.
There was more to come with Gundogan again in the right place at the back post as De Bruyne whipped in a good ball.
The comeback was complete and, even though an equaliser from Villa could have changed the picture again, it never looked like happening as City celebrated another league crown.