Aaron Boone was also 3-for-4 with two runs scored as Cleveland avoided a sweep in the three-game, weekend series.
"This was a big win for us today. With the way we played the last couple of nights, playing the team leading our division that we had lost a bunch in a row to (five consecutive)," said Indians' manager Eric Wedge. "Certain points in time during the season when wins mean a little more and I think that was one of them."
Johnson (3-4) allowed six hits, didn't walk a batter and struck out two in six innings against his former teammates in his first win since April 18. He had lost four decisions in a row.
"Just kept the ball down. The ball's been up a lot lately," said Johnson, who threw mostly a sinker and a slider. "Keeping the sinker down in the zone."
Five relievers helped finish off the seven-hit shutout.
Detroit had runners on first and third with one out in the third after a leadoff double by Marcus Thames and an error by Indians' first baseman Eduardo Perez. But Johnson induced Placido Polanco to foul out and Ivan Rodriguez to ground out to end the threat.
The Tigers threatened again with runners on first and third with two out in the fourth after singles by Chris Shelton and Craig Monroe. But Thames popped to short to end the inning.
"He threw good pitches. He was hitting the corners all day long and you're going to win a lot of games if you hit the corners every time," said Detroit's Brandon Inge. "We just didn't hit the ball so you've got to tip your hat to him."
Tigers' starter Kenny Rogers (7-3) took the loss, his first since April 24, to break his four-decision winning streak. He allowed five runs and six hits in 4 1/3 innings, walking three and striking out two.
"I threw sinkers that weren't sinking," said Rogers. "I threw some changeups that were supposed to go down and away and they were going middle in."
The Indians scored off him right away in the first inning, taking a 3-0 lead. Jhonny Peralta looped an RBI single to left with one out to score Grady Sizemore, who had led off with a double and moved to third on a groundout. Hafner followed with his 14th homer of the season, lining a 2-0 pitch over the fence in the right-field corner.
"It was great how we came out today, it really was," said Michaels. "They were playing well and we go out and get three runs ... it kind of set the tone."
The Indians made it 5-0 in the fourth on Tim Laker's two-run double.
Michaels hit his second career grand slam in the eighth, off reliever Bobby Seay.
- Sizemore went 1-for-4 to stretch his hitting streak to nine games (12-for-39).
- Rogers has allowed five home runs in his last two games. He's given up nine for the season.