Leeds: Angelo Mathews hit a patient fifty before veteran pacer Lasith Malinga returned with a sensational four-wicket haul as Sri Lanka stunned hosts England by 20 runs in a low-scoring thriller to keep their World Cup semifinal hopes alive on Friday.
Electing to bat, Sri Lanka managed a modest 232 for nine, riding on an unbeaten 115-ball 85 by Mathews.
The 1996 champions then returned to dismiss England for 212 in 47 overs to register only their second win in this World Cup.
Malinga (4/43) emerged as the star for Sri Lanka as he dismissed the top three -- James Vince (14), Jonny Bairstow (0) and Joe Root (57) and also accounted for Jos Buttler (10).
Off-spinner Dhananjaya de Silva (3/32) then mopped up the tail with a quick three-wicket burst.
After Root's 89-ball fifty, Ben Stokes kept England in the hunt with a 89-ball 82* but he ran out of partners.
The win took Sri Lanka to fifth spot with six points from six matches, while England remained in third spot with eight points from six games.
Earlier, Mathews added 71 and 57 runs with Kusal Mendis (46) and Dhananjaya de Silva (29) for the fourth and sixth wickets, respectively, as Sri Lanka recovered from three for 2.
Playing his first World Cup game, Avishka Fernando, too, contributed with a 39-ball 49.
Chasing the total, England could not recover from the twin strike by Malinga and could score only 38 for two in the powerplay.
Root and Eoin Morgan (21) added 47 runs for the third wicket before Isuru Udana (2/41) produced a stunning caught-and-bowled effort to remove the skipper as England slipped to 73 for 3 in 18.4 overs.
Root completed his fifty off 78 balls and soon new man Stokes brought up the team hundred with a boundary off Pradeep.
Malinga then brought Sri Lanka back in the match when he had Root caught behind off a ball drifting down the leg side.
De Silva then had Moeen Ali holed out to long-off, while Chris Woakes' thin edge was caught by the keeper and another edge sent Adil Rashid back to the hut as England slipped to 178 for 8.
Earlier, Sri Lanka lost Dimuth Karunaratne (1) and Kusal Perera (2) in three balls to be reduced to three for 2.
Fernando then blasted six fours and two sixes, sharing some valuable runs with Mendis. But an upper cut gone wrong saw Sri Lanka lose Fernando and slip to 62 for three.
Leg-spinner Rashid struck twice on successive balls, removing Kusal Mendis and new man Jeevan Mendis (0), as Sri Lanka slumped to 133 for five in the 30th over.
Mathews and Dhananjaya then took the team close to the 200-mark.
Once Dhananjaya was removed by Archer in the 44th over, it was a lonely battle for Mathews.