Haren (2-5) recorded the sixth shutout and 16th complete game in his 10-year career. He was making his 266th major league start.
The Angels won their third in a row after losing three straight, getting off to a good start when Albert Pujols hit a two-run homer in the first. It was his fifth of the season.
Haren had not won since allowing a lone earned run against Cleveland on April 28. He gave up four hits to the Mariners and did not walk a batter.
After Dustin Ackley singled to open the Seattle first, Haren retired 15 in a row. Only two Seattle runners reached second base.
Pujols scored the other Los Angeles run in the sixth on a single by Kendrys Morales.
The loss went to Jason Vargas (5-4), who allowed the three runs on seven hits over seven innings. Vargas struck out six.