Carlos Santana drew a lead-off walk from Jose Mijares (1-1) and Hafner followed with a blast into the right-center field gap, scoring Santana from first and lifting the Indians to their first six-game winning streak since 2008.
Hafner's hit made a winner of Rafael Perez (3-0), who got credit for the victory despite blowing a lead by allowing RBI singles to Denard Span and Orlando Hudson in the seventh.
Joe Smith tossed a scoreless eighth and Carlos Perez hurled a 1-2-3 ninth to rack up his ninth save for the Indians.
Twins starter Kevin Slowey allowed three runs on six hits over 5 2/3 innings as Minnesota lost for the second time in a three-game set with Cleveland.
Boston schools pull out free condoms over wrapping complaints
Aaron Carter is still in love with Hilary Duff