Kelly was born in Dublin, where he played football for Belvedere before joining Tottenham Hotspur through their youth programme. He was something of an understudy to Stephen Carr and then to Paul Stalteri. He made his Spurs first team debut in 2003 and then went on to make 37 Premier League appearances, scoring two league goals, against Birmingham City and Aston Villa.
Birmingham City
Birmingham City were believed to be winning the race to sign the defender in January 2006 only for Tottenham to pull the plug on the deal because they had an injury crisis in defence. Kelly did join Birmingham, however, on 28 June 2006 for an initial fee of £750,000, possibly rising to £1.25 million depending on his success with the club. Kelly was the only outfield player in the 2007–08 Premier League season to play every minute of every game for his club.
Stoke City (loan)
On 4 February 2009, Kelly joined Stoke City on loan from Birmingham City until the end of the 2008–09 season. Stoke City had to wait for 36 hours after the January transfer window shut for confirmation of the deal. Kelly made his Stoke debut in their next game, a 2–0 defeat to Sunderland, but picked up a hamstring injury while on international duty which kept him out of Stoke's next fixture.
Fulham
On 16 June 2009, Kelly signed a three-year contract with Fulham, making him the club's first signing of the 2009 summer window. He said he was delighted to join the Cottagers and was looking forward to representing the club in both the Premier League and Europa League. He helped Fulham reach the 2010 UEFA Europa League Final, playing in their memorable win against Juventuson the way, but he was left out of the squad for the final itself.
Reading
Kelly joined Reading on 11 January 2013, signing a -year contract. He made his début on 19 January in Reading's 2–1 away win over Newcastle United at St James' Park, made his home début a week later against Sheffield United in a 4–0 FA Cup win, and soon afterwards, stated that "regardless of what happens now and for the rest of the season, coming here is the best decision I've made in football". Kelly started every game in what remained of the season, and the team were relegated to the Championship. He was allocated squad number 3 for the 2013–14 season. Kelly scored his first goal for Reading on 1 January 2014, a 95th-minute header from Royston Drenthe's free kick that gave his side a draw at home to Nottingham Forest. Kelly left Reading at the end of the 2014–15 season, despite being offered a new contract by the club.
Rotherham United
On 19 November 2015, Kelly joined Championship club Rotherham United on a deal until the end of the 2015–16 season. He left the club at the end of the 2016–17 season.