Fubar,
It is pretty much impossible to be running lean. In most driving situations the car is in closed-loop mode with the ECU controlling injector pulse duration and then validating A/F with the feedback from the O2 sensors. The O2 sensors really only indicate above/below 14.7:1 and the ECU insures that the readings "stay on the fence" i.e., right at the 14.7:1 mark. If the ECU cannot achieve this - for ANY reason, then a check engine light is generated.
This principle is virtually the same in all modern (1996 +) cars.
It would be possible to be running lean in heavier throttle applications (open-loop mode) but assuming you're not running a custom tune and you're not doing a lot of track time or very aggressive driving, I would doubt this is the problem.
Note: Open-loop is necessary in all cars but perhaps more importantly in forced induction cars because in heavier load conditions, a richer that 14.7:1 fuel mixture is desired. Since the O2 sensors are ONLY good for detecting a 14.7:1 threshold, they can not be copunted upon to indicate, say, a desired 12:1 ratio in heavier load conditions. Hence the term, "open-loop". In this mode, the ECU is looking at input sensors, rpm, temp, mass air, etc and then is using tables to determine injector pulse widths. The downside is that there is no feedback loop back to the ECU to know if it has achieved its objective.
Open-loop mode is the reason that custom tuning is needed when you add more boost to the engine via a smaller pulley, bigger blower, etc. The pre-programmed tables are no longer valid because they assume that a certain rpm/load produces "x" boost where with a mod it is now producing "y" boost.
So, sorry for the rant.... but that is a short brief on a/f ratios.