Lock Luke Charteris epitomised the Welsh effort, making 16 tackles before being replaced by Bradley Davies at the break.
Whenever Ireland threatened, Wales seemed to have enough numbers and commitment to cope, other than when wing Earls made the most of his chance.
The Welsh line-out also stood up to the notable challenge of Paul O'Connell and Donncha O'Callaghan, while at the scrum Ireland were unable to repeat the effort that led to victory over Australia.
Jamie Roberts was again the focus of Welsh efforts with ball-in-hand and, with Priestland guiding their play and Phillips continuing a rich vein of form, Warren Gatland's side proved superior in midfield to the O'Gara-O'Driscoll axis on which Ireland have relied in the past decade.
A disappointed Brian O'Driscoll says he will not get the opportunity to play in another World Cup after Ireland's quarter-final exit against Wales
Wing Williams extended his Welsh record try tally to 56 in the third minute as the Pool D runners-up began with an assurance that belied the occasion.
They patiently built a multi-phase attack in which Roberts took a high ball going forward before Halfpenny put Williams over in the right corner.
Video referee Giulio de Santis confirmed the score and Priestland converted from the wide angle.
Indiscipline and Ireland's ability to build pressure denied Wales the chance to capitalise on their good start.
Wales v Ireland at the World Cup
Wales 13-6 Ireland (Pool match)
Wales 23-24 Ireland (Pool match)
Wales 22-10 Ireland (quarter-final)
In quick succession Faletau went over the top at a ruck, George North failed to roll away from a tackle and Dan Lydiate was caught offside at a breakdown but, instead of kicking for goal, the Irish settled for a series of attacking line-outs.
When Roberts eventually managed to put Wales on the front foot, O'Driscoll intercepted Phillips' pass to launch Ireland's best attack of the opening half, in which Gordon D'Arcy's dummy and run underlined the threat posed by Declan Kidney's side.
However, Shane Williams somehow managed to hold Sean O'Brien off the floor as the flanker crossed the line to deny Ireland a first try.
An O'Gara penalty finally got the Irish on the board after the Welsh again fell foul of the tackle laws but Halfpenny's long-range penalty restored Wales' seven-point advantage by the interval.
Ireland returned rejuvenated for the second period and drew level shortly after the restart when Stephen Ferris and Tommy Bowe combined to give Earls the time and space to cross at the corner, with O'Gara adding the conversion.
The scores were tied for only five minutes as Phillips stole away on the blindside after Alun Wyn Jones' drive to give Wales an advantage they would not surrender.
Priestland failed with the conversion and also saw a penalty rebound off the post, but Wales went further ahead when centre Davies made the most of Healey's appearance in the midfield defence to fend off the prop and burst clear to score.
The time, Priestland was able to add the conversion to put Wales 12 points ahead with 15 minutes remaining.
Ireland's attempt a response saw replacement scrum-half Eoin Reddan conjure a superb pass to O'Brien.
But the Irish flanker was halted three metres short and knocked on before Healey was penalised at the scrum, allowing Wales to clear.
Ireland threw all they had left at Wales in the closing stages, but the defence coached by Shaun Edwards proved equal to the task.
Leigh Halfpenny (Cardiff Blues); George North (Scarlets), Jonathan Davies (Scarlets), Jamie Roberts (Cardiff Blues), Shane Williams (Ospreys); Rhys Priestland (Scarlets), Mike Phillips (Bayonne); Gethin Jenkins (Cardiff Blues), Huw Bennett (Ospreys), Adam Jones (Ospreys), Luke Charteris (Dragons), Alun Wyn Jones (Ospreys), Dan Lydiate (Dragons) Sam Warburton (Cardiff Blues, capt), Toby Faletau (Dragons).
Bradley Davies (Cardiff Blues, for Charteris, 40), James Hook (Perpignan, for Priestland, 77).
Not used: Lloyd Burns (Dragons), Paul James (Ospreys), Ryan Jones (Ospreys), Lloyd Williams (Cardiff Blues), Scott Williams (Scarlets).
Rob Kearney (Leinster); Tommy Bowe (Ospreys), Brian O'Driscoll (Leinster, capt), Gordon D'Arcy (Leinster), Keith Earls (Munster); Ronan O'Gara (Munster), Conor Murray (Munster); Cian Healy (Leinster), Rory Best (Ulster), Mike Ross (Leinster), Donncha O'Callaghan (Munster), Paul O'Connell (Munster), Stephen Ferris (Ulster), Sean O'Brien (Leinster), Jamie Heaslip (Leinster).
Donncha Ryan (Munster, for Heaslip, 74), Denis Leamy (Munster, for Ferris, 74), Eoin Reddan (Leinster, for Murray, 55), Jonathan Sexton (Leinster, for O'Gara, 55), Andrew Trimble (Ulster, for Earls, 71).
Not used: Sean Cronin (Leinster), Tom Court (Ulster).
Craig Joubert (South Africa).
Wayne Barnes (England), Romain Poite (France)
This page is best viewed in an up-to-date web browser with style sheets (CSS) enabled. While you will be able to view the content of this page in your current browser, you will not be able to get the full visual experience. Please consider upgrading your browser software or enabling style sheets (CSS) if you are able to do so.