Jonny Bairstow hit a hundred before Chris Woakes starred as England ended India's unbeaten run at this World Cup with a 31-run win on Sunday to once again leave semi-final qualification in their own hands.
England, who came into this match on the back of successive defeats by Sri Lanka and Australia, will be assured of a place in the last four if they beat New Zealand in their last group match on Wednesday.
India can reach the knockout phase by beating Bangladesh when they return to Edgbaston on Tuesday.
England's bid to win a first World Cup title is based on aggressive top-order batting but the runs had dried up lately.
That made their 337-7 after captain Eoin Morgan won the toss on a good pitch in Birmingham all the more heartening.
India vs England highlights
Bairstow top-scored with 111 and all-rounder Ben Stokes added a brisk 79, with India paceman Mohammed Shami taking a career-best 5-69.
"We played extremely well. Jason Roy and Bairstow at the top were magnificent to watch," Morgan said.
"The continuation of partnerships throughout took us to a formidable total.
"From 10-20 overs we got 90-odd runs and that was the winning of the game.
"We took on the spinners and that's the way we want to play our cricket. Hopefully this kick starts it for us."
No side have made more batting second to win a World Cup match than Ireland's 329-7 against England at Bangalore in 2011.
Title contenders India weren't up to the task as their chase petered out on 306-5.
India captain Virat Kohli defended his side's limp chase, saying: "Every team has lost a game or two here and there. No-one likes to lose but we have to take in our stride.
"We are still playing good cricket. The mood is the same in the changing room. We will learn from it and move forward."
India were a long way off from the moment opener KL Rahul was caught and bowled for a duck by Warwickshire paceman Woakes, who reeled off an impressive three straight maidens with the new ball on his home ground.
Rohit Sharma, Rahul's opening partner, should have fallen for four but Joe Root dropped a routine second-slip catch off fast bowler Jofra Archer.
It threatened to be a costly miss with Sharma going on to 102, his third century of the tournament, in front of an overwhelmingly India-supporting capacity crowd of more than 24,000.
Sharma also shared a second-wicket stand of 138 with Kohli, whose 66 was the star batsman's fifth successive fifty of this World Cup.
But Kohli fell when he sliced Liam Plunkett to backward point.
Sharma went to three figures, after scores of 122 not out against South Africa and 140 against Pakistan, in 106 balls with 15 fours.
But the pressure of the chase told when he was caught behind off a Woakes off-cutter to leave India 198-3 in the 37th over.
Rishabh Pant made 32 at better than a run-a-ball and it looked as if he had hit the first six of the innings only for Woakes, running round from deep backward square, to hold a brilliant diving catch.
India needed 104 more runs off the last 10 overs but their hopes faded when the big-hitting Hardik Pandya (45) holed out to substitute James Vince off fast bowler Plunkett, who justified his recall in place of off-spinner Moeen Ali with 3-55.
Earlier, Bairstow and Jason Roy (66), returning after missing three matches with a torn hamstring, shared a first-wicket stand of 160 -- the highest opening partnership of the tournament.
Roy could have been out on 21 when all-rounder Pandya appealed for a caught behind down the legside.
But umpire Aleem Dar signalled a wide instead and Kohli opted against a review, although replays suggested the ball had touched Roy's glove.
Roy reached fifty in just 41 balls before, on 66, he was well caught by substitute Ravindra Jadeja at long-on.
A single off Pandya saw Bairstow to a 90 ball-hundred, including eight fours and six sixes, before he carved Shami to deep cover.