George North's late try saw Wales end a run of eight successive Test defeats with their first Six Nations win in Paris since 2005.
The giant wing's score with eight minutes left was the highlight of a lacklustre affair on a freezing evening that saw France booed off after following up defeat by Italy with another inept display.
A penalty apiece for Frederic Michalak and Leigh Halfpenny were the only scores of a low-key opening period.
Both added another after the resumption to leave the game deadlocked at 6-6 before North's try broke the stalemate, Halfpenny converting and adding another penalty to take Wales clear.
If the victory was an ugly one, built on a rock-solid defence, it will bring much-needed relief to the defending champions and their interim coach Rob Howley.
They will now travel to Rome in a fortnight in much better heart, having banished the spectre of equalling their record run of 10 successive defeats.
France, who started the Championship as favourites, will head to Twickenham - where they have not won in the Six Nations since 2005 - looking like Wooden Spoon contenders, with a trip to Dublin also still to come.
Wales dominated territory for large periods of the first half, but a lack of precision and penetration in the French 22 saw them fail to translate it into points.
They turned the ball over on 14 occasions in their opening defeat against Ireland, and the same problem resurfaced at crucial moments before the interval.
After Dan Biggar sent a neat grubber to the right corner on the half-hour that Yoann Huget was forced to put into touch, Wales won the line-out but promptly lost possession in a promising position.
Five minutes later, after an inside pass from Jamie Roberts had brought North in off his wing, the men in red again looked poised for a breakthrough, only for another move to unravel.
Michalak had opened the scoring in the 14th minute after the visitors were penalised for a second time at the scrum but it was swiftly cancelled out by Halfpenny after a French infringement in front of their own posts.
France full-back Huget was a danger with ball in hand, but his failure to release Wesley Fofana after 20 minutes with an overlap beckoning let Wales off the hook.
Barrel-chested Mathieu Bastareaud bulldozed his way through several Welshmen, but the visitors' defence held firm, winning a vital turnover that allowed Halfpenny a relieving clearance.
Wales were forced to scramble again moments later after the full-back's kick was charged down by Huget, but to the frustration of the home crowd, France were equally profligate when they reached the Welsh 22.
Whistles then greeted the players as they departed for the changing rooms at half-time.
Phillips did his best to stir Wales into action with a 50-metre break from his own 22 on the resumption, and Halfpenny put Wales back in front after Dimitri Szarzewski was penalised at an ensuing ruck.
France threatened, only for Francois Trinh-Duc - on as a half-time replacement at full-back with Huget moving to the left wing - to push a woeful drop-goal attempt wide.
But when Wales were penalised for collapsing another scrum, Michalak stroked France level in the 53rd minute.
A barnstorming charge up the right touchline by France number eight Louis Picamoles briefly lifted local spirits but the momentum was not sustained.
Suddenly, nine minutes from time, a flash of inspiration from Biggar belatedly found the key to victory. The fly-half's delicate chip over the onrushing French defence bounced up perfectly for the charging North, who ploughed over Trinh-Duc to score in the left corner.
Halfpenny nailed a superb touchline conversion - and two minutes later his long-range penalty brought a 10-point cushion, and blessed relief for Wales.
France: 15-Huget, 14-Fofana, 13-Bastareaud, 12-Mermoz, 11-Fall, 10-Michalak, 9-Machenaud; 1-Forestier, 2-Szarzewski, 3-Mas, 4-Suta, 5-Maestri, 6-Ouedraogo, 7-Dusautoir, 8-Picamoles.
Replacements: 16-Kayser (for Szarzewski , 51), 17-Debaty (Forestier, 51), 18-Ducalcon (for Mas, 56), 19-Taofifenua (for Suta, 65), 20-Chouly (for Ouedraogo, 52), 21-Parra (for Machenaud, 56), 22-Trinh-Duc (for Fall, 41), 23-Fritz (for Mermoz, 75).
Wales: 15-Halfpenny, 14-Cuthbert, 13-Davies, 12-Roberts, 11-North, 10-Biggar, 9-Phillips; 1-Jenkins, 2-Hibbard, 3-A Jones, 4-Coombs, 5-I Evans, 6-R Jones (captain), 7-Tipuric, 8-Faletau.
Replacements: 16-K Owens (for Hibbard, 56), 17-P James (for Jenkins, blood, 38-40, 59) , 18-Mitchell (for A Jones, 79), 19-Reed (for Evans, 79), 20-Shingler (for R Jones, 79), 21-L Williams (for Phillips, 71), 22-Hook, 23-S Williams (for Roberts, 79)
Referee: George Clancy (Ireland)