I've seen it be the water pump a few times from low timing belt tension. You probably know this, but this code gets thrown if the car warms up to fast, too slow, or does not maintain it's warm-up temp well. Fans could be a problem, as well as the radiator fan switch.
Everything was swapped for these cars, including water pump. Fans are fine. Only thing that remains is the rad. Two diff cars. They don't overheat and they both warm up fine.
Is it possible the coolant temp model isn't quite right for aging cars, and the error threshold (5C iirc) is too narrow?