Milan were made to work very hard for the three points against Frosinone, as Gianluigi Donnarumma saved a penalty before Krzysztof Piatek and Suso goals.
The Rossoneri needed to take advantage of a kind fixture list, as Roma drew, Torino lost, while Inter and Atalanta had very difficult trips to Napoli and Juventus, so registered a third straight victory. They are now mathematically qualified for at least the Europa League.
Lucas Paqueta continued his ban, with Davide Calabria, Mattia Caldara, Ivan Strinic and Giacomo Bonaventura injured, but Ignazio Abate was in tears during the warm-up when he saw a banner paying tribute to his 10 years at the club.
An early Suso snapshot was straight at Francesco Bardi, while Fabio Borini’s attempt was charged down in the box.
Lorenzo Ariaudo made a decisive sliding interception, as Franck Kessie had gone clear on a Hakan Calhanoglu through ball, but Suso’s ferocious cross on 23 minutes whipped inches past Krzysztof Piatek, Borini and the back post.
Tiemoue Bakayoko’s scuffed volley from the edge of the box bounced just wide and Piatek again didn’t get clean contact from a promising position.
Paolo Sammarco fired over following a double Bakayoko and Franck Kessie error, Calhanoglu shinned a promising opportunity from the edge of the box, but Milan were jeered off the field by their 60,000 fans at half-time.
Within 20 seconds of the restart, Borini failed to take advantage of a Piatek knockdown and defensive error, leaning back to balloon over from 14 yards.
Incredibly, already-relegated Frosinone were awarded a penalty when Luca Paganini got in front of Abate, the Milan veteran clumsily bundling into the back of him. Gianluigi Donnarumma came to the rescue with a fine save to keep out Camillo Ciano’s spot-kick.
Borini was wasteful again, nodding back from the by-line with nobody there to meet it, but Milan rode their luck to break through eventually.
It was Piatek who also ended his goal drought, sneaking up behind the last defender and just keeping onside to get the decisive flick on a mis-kicked Borini effort. It was his first strike since April 6.
Frosinone did not give in and kept pushing, but Suso curled a magnificent free kick over the wall and in off the underside of the crossbar, giving Bardi no chance whatsoever of stopping it.
Federico Dionisi was unable to keep his finish down after the Milan offside trap failed, but there was still time for an emotional Abate to be given a standing ovation in his final San Siro appearance for the Rossoneri.
Donnarumma also kept his clean sheet with another sensational save on Valzania’s volley at the back post.
See the latest Serie A predictions and betting tips with Eurotips.co.uk
Saved penalty: Ciano 49 (F)