Born in Dudley, West Midlands, Penn began his career at Birmingham City in their youth system in July 2001. He joined the youth system at Kidderminster Harriers in March 2002, and appeared in one youth team match against Wellington on 7 March before joining Scunthorpe United's youth system in July 2002.
He joined Kidderminster Harriers on a free transfer in the summer of 2005; shortly after he joined he had a short spell on loan at Alvechurch before breaking into the Kidderminster team.
Penn joined newly promoted League Two club Burton Albion on 9 July 2009 on a two-year contract, for an undisclosed fee thought to be a club record. He scored his first goal for Burton on 15 August 2009 in a 5–2 win over Morecambe.
Penn signed for League Two club Cheltenham Town on a two-year contract on 23 May 2011, after he rejected a new contract with Burton. He scored his first goal for Cheltenham in an FA Cup second-round match away at Luton Town in December 2011, followed quickly by his second goal a week later in a home League Two match against Southend United.
On 7 January 2013, Penn turned in a man of the match performance and scored the home team's goal (his third for Cheltenham) in a 5–1 FA Cup third-round defeat at the hands of Premier League team Everton. Following the departure of club captain Alan Bennett in the January 2013 transfer window, Penn was named the new club captain by Cheltenham manager Mark Yates.
Penn signed for Cheltenham's League Two rivals York City on 6 January 2014 on a two-and-a-half-year contract for an undisclosed fee.
Penn turned down a new contract with York to join League Two club Carlisle United on 27 May 2016 on a one-year contract. On 22 September 2016, Penn joined National League club Gateshead on a one-month loan until 25 October, having only made two appearances for Carlisle. On 24 October 2016, the loan was extended until 26 December.
On 13 January 2017, Penn signed for National League club Wrexham on a contract until the end of 2016–17, after leaving Carlisle by mutual consent.
On 11 May 2017, Penn rejoined Gateshead on a one-year contract, after turning down a new contract with Wrexham because of family reasons.
Penn was capped eight times by England C, scoring one goal, from 2007 to 2009. Having been a regular member of the team for two years, he was named the England C Player of the Year for 2009.As of match played 12 September 2017