An experimental Italy hit the woodwork with Lorenzo Insigne, but was beaten by a late Robbie Brady header to send Ireland through.
The Azzurri made eight changes, but surprisingly kept Leonardo Bonucci in despite being on a yellow card ahead of the Round of 16 clash with Spain. Ireland needed a victory to progress and brought in Daryl Murphy and James McClean for an attacking approach after drawing with Sweden and losing 3-0 to Belgium.
Ireland were understandably more aggressive from the start and Jeff Hendrick’s scorcher was inches wide from distance and Salvatore Sirigu fingertipped a Daryl Murphy header over from a corner.
Another Duffy header was off target, but Bonucci was fortunate his elbow on Shane Long was before the corner was in play.
Both Long and Sirigu were booked on 39 minutes for an argument that had been brewing for a while. Ciro Immobile had the only Italy chance of the first half, spinning round to smash just wide of the near stick from 20 metres.
Ireland had penalty appeals with McClean, as Bernardeschi appeared to nudge him in the back, but the referee waved play on.
In the second half Simone Zaza’s splendid volley was inches over from a Mattia De Sciglio cross, but Bonucci was skating on thin ice with a foul that risked a booking on James McClean.
Sirigu punched away a Murphy cross-shot, then Thiago Motta horribly failed to clear and Angelo Ogbonna had to charge down the Seamus Coleman follow-up.
Bernardeschi continued to struggle and was replaced by Matteo Darmian, but McClean’s cross flew past everyone including Sirigu and Ireland kept firing off target from distance.
Lorenzo Insigne was finally given his Euro 2016 debut and with practically his first touch dribbled forward to curl a right-foot finish on to the far post with Darren Randolph well beaten.
Andrea Barzagli went into the book and yellow cards won’t be wiped out until the quarter-final stage. Duffy and Randolph combined to stop Zaza nodding in a Stefano Sturaro cross, while Wes Hoolahan failed to make the most of a defensive error, firing straight at Sirigu.
Ireland did get the opener with five minutes to go, a free header from 10 yards as Bonucci miscalculated Hoolahan’s cross from the right.
Italy 0-1 Ireland
Brady 85 (RI)
Italy: Sirigu; Barzagli, Bonucci, Ogbonna; Bernardeschi (Darmian 60), Florenzi, Thiago Motta, Sturaro, De Sciglio (El Shaarawy 81); Zaza, Immobile (Insigne 74)
Republic of Ireland: Randolph; Coleman, Duffy, Keogh, Ward, McClean, Hendrick, McCarthy (Hoolahan 77), Brady, Murphy (McGeady 70); Long (Quinn 90)
Ref: Hategan (ROU)