Group B, Cape Town: Sri Lanka 228-6 (50 overs) beat the West Indies 222-9 (50 overs) by six runs.
Sri Lanka survived a major scare as they completed a nail-biting victory over the West Indies to go back to the top of Group B.
Chaminda Vaas claimed four key wickets to check a promising West Indies run chase and leave his side on course for a seemingly easy win.
But Ramnaresh Sarwan returned late in the innings to lead a thrilling recovery after earlier being treated in hospital after being hit by a bouncer.
And the Windies finally missed out by a whisker as a target of 14 off the last over proved just beyond them, leaving them on the brink of a World Cup exit.
Sri Lanka had been favourites for victory from the moment captain Sanath Jayasuriya won the toss to ensure the Windies would be forced to chase a total under the lights.
This was a tight match and we bowled really well under pressure
Sri Lanka captain Sanath Jayasuriya
But a disappointing 228 from Sri Lanka's 50 overs left the match in the balance.
Opener Jayasuriya top-scored with 66 as Marvan Atapattu (3), Hashan Tillakaratne (36), Aravinda de Silva (13) and Mahela Jayawardene (9) all failed to emulate their captain's patient approach.
When Jayasuriya was caught by Shivnarine Chanderpaul off Chris Gayle in the 34th over, it was left to Kumar Sangakkara (24), Russel Arnold (34 not out) and Vaas (28 not out) to set a respectable total.
Having done much of the hard work, the West Indies began their innings in disastrous fashion as Wavell Hinds top-edged an attempted hook off Vaas in the third over to depart for two.
Vaas then had Brian Lara caught behind by Sangakkara for one and things looked bleak when Sarwan was hit on the helmet by a Dilhara Fernando bouncer and captain Carl Hooper was lbw next ball.
A promising innings of 55 from Gayle ended when Vaas had him lbw for 55 before dismissing Ridley Jacobs in similar fashion two balls later.
Ricardo Powell was bowled by Muttiah Muralitharan in the next over and Sri Lanka were as good as home when Chanderpaul was caught by Atapattu off De Silva for 65.
But 25 runs from Vasbert Drakes and some huge hits from Sarwan (47 not out) gave the Windies hope.
And it took gutsy final overs from Muralitharan and Gunaratne to steer Sri Lanka home.
Sri Lanka: Sanath Jayasuriya (capt), Marvan Atapattu, Hashan Tillakaratne, Aravinda de Silva, Mahela Jayawardene, Russel Arnold, Kumar Sangakkara, Chaminda Vaas, Muttiah Muralitharan, Dilhara Fernando, Pulasthi Gunaratne.
West Indies: Chris Gayle, Wavell Hinds, Brian Lara, Shivnarine Chanderpaul, Carl Hooper (capt), Ramnaresh Sarwan, Ricardo Powell, Ridley Jacobs, Vasbert Drakes, Mervyn Dillon, Pedro Collins.
Umpires: D L Orchard and S Venkataraghavan.