Chamara Kapugedera hit a six off the last ball as Sri Lanka beat India by five wickets.
Sri Lanka all but assured themselves of a semi spot as the West indies have to give Australia a severe beating if they are to qualify.
The victors gave South Africa a good lesson in showing big match temperament in a run-chase as they required 25 off the final eights balls. Kapugedera’s massive hitting meant he then required three off the final Ashish Nehra delivery, and he waltzed down the wicket and put the ball over the extra cover boundary.
He ended on 37* off just 16 balls, which included three sixes and two boundaries.
Earlier on a typically slow St Lucia wicket, India won the toss and opted to set a total. They reached 163-5, with Suresh Raina again the main contributor, but their laboured approach hurt them. They were 90-1 at the halfway mark, but they failed to fully capitalise on that start.
In reply, Sri Lanka lost the tournament’s leading run-scorer, Mahela Jayawardene, in the first over. Matters only got worse as Sanath Jayasuriya’s poor form continued, and at 6-2 in the second, they were in deep trouble.
But Kumar Sangakarra and Angelo Mathews fought hard, and Kapugedera finished the deal.
India 163-5 in 20 overs
Suresh Raina 63, Lasith Malinga 2-25
Sri Lanka 167-5 in 20 overs
Kumar Sangakarra 46, Angelo Mathews 46, R Vinay Kumar 2-30
Sri Lanka win by five wickets
Click here for live scorecard.