James created the score with a chip kick to captain Alex Crockett - and despite failing to convert his own try, the Springbok left the field to rapturous applause from a full house at the Recreation Ground.
In an outstanding match which entirely lived up to its billing, second-placed Tigers thought they had knocked Bath off top spot when replacement hooker Mefin Davies forced his way over from close range in the 77th minute - and Geordan Murphy chipped over the conversion to open up a 21-20 lead.
But Bath, after being under the cosh for most of the game, somehow found the energy to claim the points.
James had had a mixed game against his South African compatriot Derick Hougaard, whose tactical kicking and three penalties kept the visitors in the game after being ambushed by Bath on the break through tries by Pieter Dixon and number eight Daniel Browne.
Both sides adapted to the loss of players to England and other national teams, but Leicester's ranks were boosted by the return of Lewis Moody in the back row.
Bath's back five of the scrum was one of the biggest the club have fielded - Danny Grewcock paired with Justin Harrison for the first time in a league match. Scott Bemand, facing his old club for the first time, deputised at scrum-half for the injured Michael Claasens.
James opened the scoring with an angled penalty on seven minutes. But his tactical kicking was unusually awry, and Leicester enjoyed a monopoly of possession for most of the first half.
Even when they forced a five-metre scrum, however, Bath's defence held firm - and the home forwards eventually counter-rucked on their own line to relieve the pressure.
Hougaard's close-range penalty levelled the scores on 14 minutes, rewarding his forwards for their muscular efforts. Despite a wealth of territory and possession, the visitors had difficulty in generating the quick ball they needed to create try-scoring opportunities.
Instead it was Bath who broke away to create a spectacular 16th-minute try for hooker Dixon, who was put through a gap 45 metres from the posts and side-stepped the hapless Murphy. James converted.
Again Leicester set up camp in the Bath half, but the home side defended with ferocity and punished a Tigers transgression with a second James penalty on 32 minutes.
Five minutes later, a neat James grubber kick forced Murphy to concede a five-metre scrum. The Bath pack had their tails up, and marched their opponents over the line for Browne to claim the try. James added the conversion.
In the 10 minutes after the restart, Hougaard chipped away at that lead with two penalties. Wing Matt Smith thought he had scored a try, but play was brought back for a knock-on by Moody.
Tigers did not have long to wait, however, Johne Murphy squeezing in at the corner on the hour as the Bath defence finally broke. Struggling for possession, Bath nearly created a score for Crockett but had to chase back after Leicester hacked clear.
When Dixon was yellow-carded for a professional foul on 69 minutes Bath were really up against it, but a forward pass by Craig Newby was spotted by the referee.
Tries: Browne, Dixon, James
Cons: James 2
Pens: James 2
Tries: J. Murphy, Davies
Con: G. Murphy
Pens: Hougaard 3
Bath: 15 Joe Maddock, 14 Andrew Higgins, 13 Alex Crockett (c), 12 Shaun Berne, 11 Matt Banahan, 10 Butch James, 9 Scott Bemand, 8 Daniel Browne, 7 Jonny Faamatuainu, 6 Peter Short, 5 Danny Grewcock, 4 Justin Harrison, 3 Duncan Bell, 2 Pieter Dixon, 1 David Barnes.
Replacements: 16 Rob Hawkins, 17 Aaron Jarvis, 18 Stuart Hooper, 19 James Scaysbrook, 20 Mike Baxter, 21 Eliota Fuimaono-Sapolu, 22 Jack Cuthbert.
Leicester: 15 Geordan Murphy, 14 Johne Murphy, 13 Dan Hipkiss, 12 Aaron Mauger, 11 Matt Smith, 10 Derick Hougaard, 9 Julien Dupuy, 8 Jordan Crane. 7 Lewis Moody, 6 Martin Corry (c), 5 Marco Wentzel, 4 Richard Blaze, 3 Dan Cole, 2 George Chuter, 1 Boris Stankovich.
Replacements: 16 Mefin Davies, 17 Santiago Bonorino, 18 Ben Kay, 19 Brett Deacon, 20 Ben Youngs, 21 Tom Varndell, 22 Craig Newby.
Referee: Andrew Small
Touch judges: Bob Mullis, Ken Stewart
Assessor: Brian Campsall
Television match official: Laurie Bryant