A second half strike by substitute Jakub Blaszczykowski booked Poland's ticket into the last-16 at Euro 2016 and sent hapless Ukraine home without a point.
The 30-year-old Fiorentina veteran had been rested by coach Adam Nawalka who made four changes in all but scored minutes from his introduction at halftime to decide the tie.
With two 1-0 wins in Group C against Northern Ireland and the Ukrainians either side of a scoreless draw against Germany, Poland finished in second place in the group on goal difference.
After defeats to Germany and the Irish, Ukraine were already eliminated before the game in the Stade Velodrome. Their latest failure meant they became the first team to go five matches without a goal in Euro history.
With pride at stake for Mykhailo Fomenko's men and a chance of topping the Group C table beckoning for Poland, both teams attacked from the off.
Poland's formidable strike pair Arkadiusz Milik and Robert Lewandowski each had early chances, the Bayern Munich star volleying the more clearcut of the two over Andriy Yatov's crossbar.
Ukraine's Andriy Yarmolenko should have scored on the quarter hour but chipped wide when one—on-one against Lukasz Fabianski.
Lewandowski found more room than in the previous two games and had a drive deflected wide on 20 minutes, but from the half-hour Ukraine began to assert themselves.
With impressive teenager Olexandr Zinchenko, 19, orchestrating from midfield, Poland were stretched on occasion.
Winger Yevhen Konoplyanka drilled a low effort narrowly wide on the half hour. Soon after left-back Bohdan Butko crossed when a shot seemed a better option.
But with lone striker Roman Zozulya proving ineffective, Ukraine could not find their first goal since their opening game at the Euro 2012 tournament that they co-hosted with Poland.
Instead, it was Poland's half-time sub Blaszczykowski who broke the deadlock with a delightful strike.
Fed by Milik on the right of the area in the 53rd minute, he worked the ball onto his left foot and curled a shot inside the far-post to send the Velodrome, decked out mainly in Poland's red and white, into raucous celebration.
A minute later, with the fans still jumping, Poland's own 19-year-old Bartosz Kapusztka nearly made it two but fired wide of both Pyatov and the post.
The Poles eased up after that, a Milik header well wide with 15 minutes to go the nearest they came to making it two.
In truth Mykhailo Fomenko's men rarely troubled Fabianski.
Captain Ruslan Rotan forced him to dive eight minutes from the end and Zozulya headed narrowly wide soon after but two second-half blasts over the bar from Konoplyanka and Zinchenko were more typical of Ukraine's miserable tournament.