Their Sri Lankan record ninth-wicket stand of 105 compounded the effect of a shoddy England fielding display, which saw the hosts drop nine catches in all during the match, the first of a three-Test series.
Vaas finished on 50 not out after Kulasekara, in only his third match at this level, had made a Test-best 64.
Sri Lanka, following-on in reply to England's first innings 551 for six declared, closed on 537 for nine - 178 ahead - after 14 hours of resistance in an innings lasting 199 overs.
"If we held our catches we'd have won the game," said England captain Andrew Flintoff. "But they (Sri Lanka) kept going and batting and batting and kept us in the field for three-and-a-half days."
Sri Lanka's score was the highest total in the second innings of a Lord's Test, beating the 529 for five declared England made against them in 2002.
They had been just 62 runs ahead when pacemen Vaas and Kulasekara came together in overcast, swing-friendly conditions.
But the fact that Sri Lanka were eventually in a position to avoid defeat owed much to a century Sunday from their captain and Mahela Jayawardene, after he top-scored with 61 in his team's meagre first innings 192.
"It was a disappointing first innings performance, and we knew we had to show some character, which we did. We're pretty happy with the effort," said Jayawardene, the man-of-the-match.
He was also a beneficiary of England's fallible slip fielding, dropped for 58 - 61 runs short of his eventual 119 - by Andrew Strauss.
At tea, Sri Lanka were 510 for eight, Vaas 34 not out and the 23-year-old Kulasekara 55 not out.
Flintoff, captaining England with Michael Vaughan injured, ignored concerns about his long-term health, the all-rounder bowling 50 overs in a Test innings for the first time.
But it was fellow quick Hoggard who finally broke a stand spanning 46 overs when he had Kulasekara, hooking, caught by Kevin Pietersen on the mid-wicket boundary.
Kulasekara faced 133 balls in over three hours, with two sixes and seven fours.
His partnership with Vaas broke Sri Lanka's previous ninth-wicket Test best of 101 set by Sanath Jayasuriya and Dilhara Fernando against Pakistan at Faisalabad in 2004/05.
Vaas, after a brief bad light stoppage, was then dropped on 41 at backward-point by a leaping Paul Collingwood, who got two hands to the ball, off debutant quick Sajid Mahmood.
The light also denied Sri Lanka what was an outside chance of victory, even for an attack boasting champion off-spinner Muralitharan.
History was against them as only three times in the 129 years of Test cricket had a team won after following-on, with Australia the losing side on each occasion - against England at Sydney in 1894/95 (lost by 10 runs), England again at Headingley in 1981 (12 runs) and India at Calcutta (Kolkata) in 2000/01 (171 runs).
But not since New Zealand last man Danny Morrison had batted for nearly three hours during a last-wicket stand of 106 with Nathan Astle at Auckland in 1997 had England been so remarkably denied what had at one time seemed certain victory by gutsy tailend batting.
Earlier Alastair Cook, in the gully, put down a routine chance from Kulasekara, on 14, off Mahmood.
Meanwhile England were missing Vaughan's input, Flintoff formulaic in his field-settings and bowling changes.
Kulasekara swept under-used left-arm spinner Monty Panesar for six before repeating the stroke to go to a maiden Test fifty as Sri Lanka reached 500.
Sri Lanka resumed Monday on 381 for six and soon lost Chamara Kapugedera for 10.
Tillakaratne Dilshan though held firm for 69 before he edged persevering fast bowler Liam Plunkett to first slip Marcus Trescothick.
Sri Lanka had been overpowered in their first innings with Hoggard becoming the tenth Englishman to take 200 Test wickets on his way to four for 27.
On Friday, England completed their highest total against Sri Lanka after hundreds from Pietersen (158) and Trescothick (106).
The second Test is due to start at Edgbaston on May 25.
Sri Lanka 1st Innings: 192 (M Jayawardene 61; M Hoggard 4-27, S Mahmood 3-50)
Sri Lanka 2nd Innings: (overnight: 381-6)
Fall of wickets: 1-10, 2-119, 3-178, 4-291, 5-303, 6-371, 7-405, 8-421, 9-526
England: Marcus Trescothick, Andrew Strauss, Alastair Cook, Kevin Pietersen, Paul Collingwood, Andrew Flintoff (capt), Geraint Jones (wkt), Liam Plunkett, Matthew Hoggard, Sajid Mahmood, Monty Panesar
Umpires: Aleem Dar (PAK) and Rudi Koertzen (RSA), TV umpire: Nigel Llong (ENG)
Match referee: Alan Hurst (AUS)
Result: Match drawn
Man of the Match: Mahela Jayawardene (SRI)
May 25-29: 2nd Test, Edgbaston
Jun 02-06: 3rd Test, Trent Bridge