England, set 236 to win, finished on 233 for eight when Fernando (three for 41) bowled Ravi Bopara, whose career-best 52 off 53 balls so nearly set up an improbable win in only his fifth one-day international.
But Sri Lanka, who'd lost a one-wicket nail-biter to South Africa, held on with the 1996 champions moving a step closer to the semi-finals.
England must now try to revive their ailing bid for a last four spot against world champions Australia here Sunday.
Bopara and Paul Nixon took England to the brink of a sensational win, after they's been down and out at at 133 for six in the 34th over, with a stand of 87.
England needed 77 to win off the last 10 overs with four wickets standing, Bopara and Nixon still in when 49 were required off five.
But after wicket-keeper Nixon reversed swept Muttiah Muralitharan for a six and a four, the target was 19 off two overs.
However, when Nixon holed out off Lasith Malinga to Sri Lanka captain Mahela Jayawardene for 42 off 44 balls, England were 220 for seven - still requiring 16 off seven balls for victory.
But Bopara square cut Malinga's final ball for four and England needed 12 off the last over.
His cheeky sweep for four off Fernando then made it seven off four balls.
By the time Bopara faced the last ball three were still needed only for the Essex all-rounder to be clean bowled.
Sajid Mahmood, who'd eearlier taken a career-best four for 50, was two not out.
England were on course for victory at 101 for two.
But the unfortunate run out of Ian Bell (47) started a slump that saw four wickets lost for 32 runs in 49 balls.
Together with Kevin Pietersen (58), Bell put on 90 for the third wicket.
Well though England bowled, there was always the suspicion that Sri Lanka, had enough runs to play with.
It certainly seemed that way as England lost both openers cheaply to be 11 for two.
Before this match England skipper Michael Vaughan said it was time he scored a hundred, having failed to reach three figures in a limited overs international.
Instead the England captain, in his 82nd match at this level, fell for nought when, shaping to glance Chaminda Vaas, he was caught by wicket-keeper Kumar Sangakkara.
Pietersen, rated the world's best one-day batsman, counter-attacked by lofting Vaas for a straight six.
Bell, the only survivor from the England side that suffered an eight-wicket defeat at Headingley in July that saw Sri Lanka wrap up a 5-0 one-day series victory, followed up by cutting the left-arm quick for four.
Bell, almost run out for 39, went that way soon afterwards in cruel fashion after a stand spanning 20 overs.
Pietersen drove left-arm spinner Sanath Jayasuriya down the pitch and the bowler deflected the ball onto the stumps as Bell turned to ground his bat.
Third umpire Rudi Koertzen took several minutes over the decision before giving Bell, who'd faced 71 balls with four fours, out.
Pietersen then completed a 74-ball fifty with one six and three fours
But two balls after sweeping Muttiah Muralitharan for four he chipped a return catch to the star off-spinner
England were now 126 for four in the 31st over and the game was in the balance.
It swung Sri Lanka's way when the next two wickets fell on 133.
Andrew Flintoff (two) miscued Fernando to Malinga at mid-on before Collingwood was lbw to the paceman for 14.
Upul Tharanga (62) and Jayawardene (56) were the major contributors in a Sri Lanka innings which stalled after Jayasuriya, who scored 115 in the 113-run win over the West Indies on Sunday, made a typically rapid 25.
Sri Lanka next play New Zealand, another side tipped to challenge Australia, in Grenada on Thursday.