Radja Nainggolan gave Belgium their second consecutive victory and set up a clash with Hungary, but Sweden crashed out.
The Red Devils recovered from their opening defeat to Italy in order to beat Ireland 3-0, but were still not mathematically sure of second place. Mousa Dembele was on the treatment table, while Sweden missed Mikael Lustig and had only one point from two games. Zlatan Ibrahimovic announced this would be his final match for Sweden if they went out of the Euros.
Sweden had the better head-to-head record going in thanks to seven victories, two draws and only five losses.
In the opening minutes, Sweden had their first shot on target of the entire tournament, but Marcus Berg fired straight at the goalkeeper.
It was an even game, Kevin De Bruyne’s effort easily saved and Ibrahimovic toe-poked wide from the edge of the box. Thomas Meunier’s header whistled wide from a corner and Eden Hazard’s effort was charged down.
Ibrahimovic volleyed in, but was flagged offside, while John Guidetti came off the bench and immediately had a shot charged down in the area.
Andreas Isaksson denied De Bruyne from a Toby Alderweireld cross and Romelu Lukaku also had a goal ruled offside.
Thibaut Courtois had his gloves stung by a ferocious Ibrahimovic free kick and Isaksson beat away a solo effort from Dries Mertens.
Belgium broke through with six minutes to spare, as Eden Hazard’s cross came all the way to Radja Nainggolan for a thunderous finish from distance.
Sweden 0-1 Belgium
Nainggolan 84 (B)
Sweden: Isaksson; Lindelof, Johansson, Granqvist, Olsson; Larsson (Durmaz 70), Ekdal, Kallstrom, Forsberg (Erkan Zengin 82); Berg (Guidetti 64), Ibrahimovic
Belgium: Courtois; Meunier, Alderweireld, Vermaelen, Vertonghen; Witsel, Nainggolan, De Bruyne; Carrasco (Mertens 71), Hazard (Origi 93), R Lukaku (Benteke 87)
Ref: Brych (GER)