You didn't show how you're dealing with ADC; FRC? or are you using the ADCCLK and manually timing it? If I have issues where a quick read proves inaccurate, but a repeated or longer read shows accurate results, increasing the acquisition time almost always fixes things.