City trailed Villa – managed by Liverpool great Steven Gerrard – 2-0 with 14 minutes remaining and the title was very much up for grabs.
Matty Cash and Liverpool old boy Philippe Coutinho had put Villa in control, but City incredibly scored three times in five minutes with Rodri’s shot from the edge of the box sandwiched between an Ilkay Gundogan double.
Liverpool had also fallen behind at home to Wolves as Pedro Neto profited from a Ibrahima Konate mistake in the third minute.
But Sadio Mane levelled midway through the first half, before substitute Mohamed Salah and Andrew Robertson scored in a frantic finale to give the Reds a 3-1 victory.
Liverpool, winners of the Carabao Cup and FA Cup, finished one point adrift of City on 92 points, but now have next week’s Champions League final against Real Madrid to look forward to.
Salah’s strike left him tied on 23 goals with Tottenham’s Son Heung-min in the race for the Golden Boot.
Son scored twice as Tottenham thrashed Norwich 5-0 at Carrow Road to finish fourth and secure Champions League football next season.
Dejan Kulusevski’s brace and a Harry Kane header had dispelled any pre-match Spurs nerves over the point needed to beat Arsenal to fourth.
Arsenal must settle for the Europa League, despite finishing in style with a 5-1 home victory against Everton.
Gabriel Martinelli’s penalty and Eddie Nketiah put Arsenal in command before Donny Van De Beek’s first Everton goal gave the Merseysiders hope.
But it was one-way traffic after the break as Cedric Soares, Gabriel and Martin Odegaard rubber-stamped Arsenal’s return to European football after the Gunners missed out this season.
Burnley’s six-year stay in the Premier League came to an end with a 2-1 home defeat to Newcastle.
The Clarets, who sacked Sean Dyche last month and put Mike Jackson in interim charge, fell two down on the hour to Callum Wilson’s double.
Maxwel Cornet gave Burnley hope, but Leeds’ 2-1 victory at Brentford confirmed their relegation to the Sky Bet Championship.
Raphinha put Leeds in front with a second-half penalty and Brentford were reduced to 10 men when Kristoffer Ajer had to go off as the Bees had already used their three substitutions.
Sergi Canos equalised 12 minutes from time but Brentford were soon reduced to nine when the Spaniard was sent off for a second bookable offence.
Jack Harrison settled any Leeds nerves in the fourth minute of stoppage time as the Yorkshire club became the first side since Wigan in 2011 to survive after starting the final day in the bottom three.
New Manchester United manager Erik ten Hag was among the Selhurst Park crowd as the Red Devils completed their miserable season with a 1-0 at Crystal Palace.
United old boy Wilfried Zaha pounced on a Bruno Fernandes error after 37 minutes to score his 15th goal of the season.
However, United finished sixth – and qualified for the Europa League – as West Ham were beaten 3-1 at Brighton.
The Hammers led through Michail Antonio’s first-half thunderbolt, but Joel Veltman, Pascal Gross and Danny Welbeck scored for the Seagulls after the break.
West Ham finished seventh and will play in the Europa Conference League next season.
Both Leicester – who beat Southampton 4-1 to finish eighth – and Brighton climbed above Wolves on the final day.
Goals from James Maddison, Jamie Vardy and two from substitute Ayoze Perez ensured James Ward-Prowse’s penalty for Saints was a mere consolation.
Third-placed Chelsea wrapped up their season with a 2-1 home win over relegated Watford.
Ross Barkley headed a stoppage-time winner after Dan Gosling had cancelled out Kai Havertz’s early effort.