Stoke put Vale under pressure from the start and took the lead in the fifth minute, with Keen finding space on the right flank and delivering a pin-point cross to Richard Forsyth, who headed home from close range.
Vale's first serious attack saw them back on level terms with a fine goal in the 21st minute. Rogier Koordes escaped the attentions of Ally Pickering to deliver a quality cross and Tony Naylor netted a flying header from 15 yards.
Vale's confidence rose visibly after their goal but Stoke soon regained the lead after a quick break out of defence in the 34th minute. Graham Kavanagh sprinted with the ball for all of 60 yards before finding Keen, who placed a low shot inside Musselwhite's right-hand post.
There was no let-up in the high-paced contest and Vale twice came within inches of a second equaliser in first-half stoppage time. Gareth Ainsworth's header was touched against the bar by Carl Muggleton and City's Steve Tweed appeared to handle on the blind side of the referee in the melee which followed. The scramble resulted in a corner from which Ainsworth pounced at the far post with a shot but this time it was blocked on the line.
Goals: Forsyth (5) 1-0; Naylor (21) 1-1; Keen (34) 2-1.
Stoke City: Muggleton; Pickering, Griffin, Sigurdsson, Tweed, Keen, Forsyth, Wallace, Thorne, Andrade (Crowe, 86), Kavanagh. Substitutes not used: Mackenzie, Whittle.
Port Vale: Musselwhite; Hill (Bogie, 86), Tankard, Talbot, Aspin, Snijders, Ainsworth, Porter, Mills (Foyle, 76), Naylor, Koordes (Corden, 86).
Referee: C R Wilkes (Gloucester).
Bookings: Stoke: Sigurdsson, Kavanagh, Crowe. Port Vale: Ainsworth, Naylor.
Man of the match: Keen. Attendance: 20,125.