With Liam Hendriks picking up his first major-league win, Minnesota moved a game in front of Cleveland in their battle to avoid being the last-place team in the American League Central.
Willingham singled in a run in the third, hit a two-run homer in the fifth and had another RBI single in the sixth to give Minnesota a 6-2 advantage.
The Indians narrowed their deficit with two runs in the eighth, after which Glen Perkins came on to claim his 13th save.
Hendriks (1-7) made his 18th career start scattered over two seasons and finally was rewarded with a victory. He gave up two runs on two hits over six innings.
The loss was charged to Zach McAllister (5-8), who allowed four runs on eight hits in 4 1/3.