Dan Petrescu's spectacular strike secured Southampton's fourth successive Premiership victory and compounded Manchester City's relegation worries.
The Romanian international scored after 55 minutes as the in-form Saints rose to ninth in the table, just four points off a Champions League spot.
And their sixth successive clean sheet in the Premiership - they have not conceded a goal in over nine hours of league football - left City rooted third from bottom.
And Joe Royle's team have now lost nine matches at Maine Road.
The visitors eventually found their rhythm, and, but for James Beattie's mis-kick, they might have taken the lead after 12 minutes.
Beattie blow
Darren Huckerby continued to pose problems for Southampton. Shaun Goater met his cross after 14 minutes, but Paul Jones did well to save from point-blank range.
That set the tone for some open, attractive football. Huckerby and Andrei Kanchelskis looked lively for City, while the James Beattie/Richard Dunne confrontation was a fascinating diversion at the other end.
But the Southampton top scorer's involvement ended after half an hour when he was forced to retire hurt and was replaced by former City striker Uwe Rosler.
Despite the enterprising play, mostly from City, chances were at a premium, as both defences continued their fine recent form.
But Jones showed why he has now kept 10 clean sheets in 13 games with an excellent save from Huckerby's snapshot after 40 minutes.
And an identical stop three minutes later denied Danny Tiatto, who had fired in a ferocious free kick.
After a subdued start to the second half, Southampton took the lead with the first chance of note after 55 minutes.
City failed to clear from a corner and Petrescu pivoted to steer an excellent volley into the net from close range.
City switches
Rosler was presented with an almost identical chance, but Rosler lacked Petrescu's technique and blazed well over.
Joe Royle responded to the goal with a double substitution: Laurent Charvet and former Saints striker Egil Ostenstad replacing Danny Granville and Huckerby.
City's increased accent on attack left them exposed at the back, but Southampton were unable to profit.
And the in-form keeper produced another splendid save to turn Gerard Wiekens' header behind minutes later.
City continued to press, but their play lacked coherence, with Southampton defending dutifully to hold on for another impressive win.
Man City: Weaver, Haaland, Dunne, Howey, Granville, Kanchelskis, Wiekens, Grant, Tiatto, Goater, Huckerby. Subs: Prior, Dickov, Nash, Ostenstad, Charvet.
Southampton: Jones, Lundekvam, Richards, El Khalej, Marsden, Oakley, Draper, Bridge, Petrescu, Kachloul, Beattie. Subs: Moss, Tessem, Rosler, Davies, Monk.
Referee: S Dunn (Bristol).