Ridden by Mexican jockey Mario Gutierrez, I'll Have Another (15-1) hit the lead passing the shadows of the iconic Twin Spires and kicked clear to win the $2.2 million, 1-1/4 mile (2000 metres) classic.
Bodemeister, who started as the 4-1 favourite, finished second, 1-1/2 lengths back, after trying to lead all the way.
The fast-finishing Dullahan (8-1) came third, a further neck behind while Union Rags, the 9-2 second favourite, was seventh in the 20-horse field.
I'll Have Another, a three-year-old chestnut colt, emerged as a real contender to win the Run for the Roses after winning last month's Santa Anita Derby in California.
But he was still considered an outsider and paid $32.60 for a $2 win bet in one of the most open Derbies in years.
"He is an amazing horse," said Gutierrez, who moved to the United States less than a year ago after riding for six years in Canada.
"I told everybody before the first time I rode him, I knew he was the one."
In keeping with tradition, the race was preceded by the singing of "My Old Kentucky Home" and the winner was draped in a garland of red roses as a huge crowd packed into the course, dressed in an array of outfits and sipping on mint julep drinks.
Bodemeister, who was favourite after winning last month's Arkansas Derby, jumped into the lead from post position six.
Jockey Mike Smith kicked five lengths clear rounding the final turn and looked set to win before his mount started to tire down the stretch.
I'll Have Another drew level then pulled clear over the last furlong as the crowd let out a defeaning roar.
The lone international entrant, Irish-trained Daddy Long Legs, finished last after being up on the pace in the early stages.
1. I'll Have Another
4. Went The Day Well
5. Creative Cause
7. Union Rags
8. Rousing Sermon
10. Daddy Nose Best
13. El Padrino
14. Done Talking
19. Take Charge Indy
20. Daddy Long Legs
Winning trainer: Doug O'Neill
Winning Jockey: Mario Gutierrez
Winner paid: $32.60 for a $2 win bet
Margins: One and a half lengths, neck
Time: Two minutes 01.83 seconds