Mahela Jayawardene's Sri Lankans qualified with an all-win record in the four-team group, meaning they will also carry forward two crucial points in the next round.
India's batting crumbled in the must-win game as they were bowled out for 185 chasing a 255-run target on a good pitch to put in their worst performance in the event since the 1979 edition in England.
They were the champions in 1983, semi-finalists in 1987 and 1996, and runners-up in 2003. This time, they could manage just one win in three matches, against debutants Bermuda.
Skipper Rahul Dravid, batting with a runner in the later part of his innings due to cramp, top-scored with 60 but that not good enough for his under-performing team despite enjoying the crowd support.
Bangladesh, who shocked India in their opening match, now have a chance to make it to the next round for the first time since their Cup debut in 1999 as they face Bermuda in their last Group B game here on Sunday.
Sri Lanka had more than one hero in their victory, with Upul Tharanga (64) and Chamara Silva (59) scoring solid half-centuries and off-spinner Muttiah Muralitharan and seamer Chaminda Vaas tightening the screws on India.
"I'm very happy and all credit to the boys. We batted in difficult conditions and then we bowled and fielded well," said Sri Lankan captain Jayawardene.
"Vaas and Muralitharan were brilliant. We knew we could put pressure on them by getting early wickets."
Man-of-the-match Muralitharan (3-41) also held a superb running catch at mid-off to account for Sourav Ganguly (seven).
Veteran left-arm fast bowler Vaas began it when he reacted sharply to hold a return catch to remove Robin Uthappa and then dismissed Ganguly in his disciplined opening spell.
Batting star Sachin Tendulkar also failed to sparkle as he fell for a duck, inside-edging a Dilhara Fernando delivery on to his stumps to leave his team tottering at 44-3.
Virender Sehwag sustained India's hopes with a 54-run stand for the fourth wicket with Dravid before being caught at lone slip by Jayawardene off Muralitharan.
Sehwag offered a difficult chance to wicket-keeper Kumar Sangakkara off Fernando when on 39, but failed to capitalise on it. He hit one six and five fours in his 46-ball 48.
The roof fell in on India when Yuvraj Singh was run out going for a risky single and Mahendra Dhoni was trapped leg-before by Muralitharan at the same total of 112.
"We didn't have a good partnership. We lost too many early wickets and that put us under pressure. They played very well," said Dravid.
India earlier bowled well for a major part of the innings before losing their way in the closing 10 overs which yielded 75 runs, thanks to Silva's third successive half-century.
Silva put on 83 for the fifth wicket off just 80 balls with Tillakaratne Dilshan (38), ensuring his team crossed the 250-mark.
Seamers Zaheer Khan (2-49), Munaf Patel (1-46) and Ajit Agarkar (1-33) all bowled tightly on a pitch which offered movement and bounce early in the innings.
Dravid elected to field after winning the toss and his new-ball bowlers did not let him down as both Zaheer and Agarkar exploited the conditions superbly.
Veteran Sanath Jayasuriya (six), Jayawardene (seven) and Sangakkara (15) all fell cheaply before Silva and Dilshan succeeded in neutralising India's early advantage with their sensible knocks.