Hamilton passed defending F1 champion Sebastian Vettel and two-time world champ Fernando Alonso late in the 70-lap race to post his third career win at Circuit Gilles Villeneuve.
Hamilton got the first of his 18 career F1 victories in Montreal in 2007 and won it again in 2010. He became only the third driver to win the race three times, after Michael Schumacher who had seven wins from 1994 to 2004 and Nelson Piquet who had three between 1982 and 1991.
"It's been five years since I won for the first time here, but it feels just as good," said the 27-year-old, whose strategy of pitting for two tire changes while his main opponents planned only one stop proved to be the difference. "It feels like one of the best races I've had for a very long time.
"I knew today would be tough but I loved every single minute of it."
He was joined on the podium by two of the season's big surprises — newcomer Romain Grosjean of Lotus and Sergio Perez of Sauber. Vettel and Alonso, sliding about on spent tires, dropped to fourth and fifth respectively.
It was without the usual crashes and blown engines that have marked many Canadian races, and there wasn't a whiff of trouble from protesters who disrupted events away from the race track during the week.
Race promoter Francois Dumontier said ticket sales were down as much as six per cent from previous years, partly due to the troubles, but there were still about 110,000 spectators packed into the grandstands on a warm, sunny afternoon.
With the victory, Hamilton leapt four places into top spot in driver standings with 88 points, two more than Alonso, three up on Vettel and nine ahead of Red Bull's Mark Webber.
It has been a topsy-turvy year for F1, which has never seen seven different race winners in as many races to start a season.
Equally surprising was that it took Hamilton, the 2008 world champion, this long to get a win.
Many team bosses, drivers and fans expect "normality" to set in at some point, with proven powers like McLaren, Ferrari and Red Bull taking over. But it hasn't happened yet, and who knows what surprises will crop up at the next Grand Prix June 24 in Valencia, Spain?
"I think this mix-up is normal," said Hamilton. "It's just my feeling, but I think it will continue to be like this throughout the year.
"I think it's great for Formula One and the fans. There was a lot of overtaking today. Seven different winners in seven races, I can't remember hearing about anything like that."
He then added with a laugh: "I hope there's no more. I hope there's not eight winners."
Earlier this year, Jenson Button (Australia), Alonso (Malaysia), Nico Rosberg (China), Vettel (Bahrain), Pastor Maldonado (Spain) and Webber (Monaco) won races — which was already a first since F1 began in 1950.
Vettel, starting from pole position for a second year in a row, held the lead until he pitted for super-soft tires after 16 laps, putting Hamilton in front until he went in a lap later.
Hamilton's pitted again after lap 49 with fading tires and returned in third place behind Alonso and Vettel.
On fresh tires, Hamilton cranked up the speed and passed Vettel on lap 62 and Alonso one lap later to regain the lead.
"The team did a great job with the pit stops," said Hamilton. "I was surprised I was able to look after my tires and push at the times I needed to push.
"I was surprised I was able to close the gap on Sebastian. I never thought they'd have such (tire) degradation. I wasn't able to do a one-stop. I would probably have fallen back more than they did."
Vettel and Alonso were all over the track on the final laps, allowing Grosjean and Perez to slip past. But neither could catch Hamilton, who crossed the finsh line with a 2.5-second lead.
Before this week, Grosjean only knew the track from play-racing it on his X-Box.
"On the video game, it's my favourite," the Frenchman said. "It's more bumpy than on X-box sitting on a sofa, but it's pretty interesting."
It was a second top-three finish this year for Grosjean, who was third at Bahrain, and for Perez, who was second in Malaysia.
"It means a lot," said Grosjean. "It means we're in good shape on the team. We're improving all the time. It wasn't one shot we got in Bahrain."
Perez started 15th on grid after troubles balancing the car in qualifying Saturday.
"It was a great race for the whole team," the Mexican said. "We had to fight in a different way and make the strategy work. It was a lottery, basically, but the team did a great job with the strategy and myself with keeping the tires alive."
It was a tough week for Ferrari, who looked strong in qualifying after reworking their rear end and exhaust position. The second Ferrari of Felipe Massa was 10th, after a promising sixth in Monaco two weeks ago.
The race got off to its cleanest start in memory and all 24 cars stayed on the track until lap 25, when Narain Karthikeyan's HRT spun out and stopped on the first turn. A lap later, Pedro de la Rosa's HRT was pushed into the garage with smoke billowing from its engine.
Seven-time world and Canadian Grand Prix champion Schumacher got the DRS device on his Petronas Mercedes stuck on lap 45 and went off the track and out of the race.
Spanish Grand Prix winner Pastor Maldonado was bumped from 17th to 22nd on the starting grid following a penalty for having to change his gearbox after a crash during practice on Saturday.