He played in the Cape Cod Baseball League for the Brewster Whitecaps.
He was drafted in 2006 in the 3rd round by the Red Sox. His first professional season was split between the Lowell Spinners and Greenville Drive. In 2007, Bates began the year with the Lancaster JetHawks before being promoted to the AA Portland Sea Dogs. He played with Sea Dogs until June 2009, when he was promoted to AAA Pawtucket Red Sox.
In May 2009, he was the Eastern League Player of the Month while playing with the Sea Dogs.
On July 6, 2009, Bates was called up to the Red Sox to play at first base after Jeff Bailey injured his ankle a game in two days before.
On July 26, 2010, the Red Sox outrighted Bates to Pawtucket, thus removing him from the 40-man roster.
In March 2011 he was released from Spring Training.
On May 8, 2011 he was signed by the Minnesota Twins to a minor league contract and sent to Rochester of the International League.