^^ What ve7xen said (except he means ADC not DAC). Using low reference voltages and low inputs is generally not a good idea on a cheap ADC, the specs generally get worse at low references levels, and the internal conversion noise of the ADC begins to swamp out the LSBs.
You'd get more accuracy and linearity if you use a 4.096V or 5V reference. They are available off the shelf and are very accurate and ow noise, better than a 317. You could use a 2.048V or 2.5V ref too which are available more easily.
Since you already have an op-amp in circuit, use it to add gain to the input voltage, as much as possible. You'll need a rail-to-rail input and output op-amp to measure near ground with a singe supply, or whack on a -1V rail for a cheaper op-amp (you'll need a resistor between the op-amp and the ADC to prevent a negative going voltage from damaging the ADC's input). It's advisable to put an RC filter between the op-amp and the ADC anyway, depending on your application.
With a normal op-amp the input offset voltage can be significant. This gets multiplied by the gain to give an output offset. This also drifts slowly with temperature and age. To counteract offset to some degree, take an ADC sample with a known zero input. Any voltage at the ADC 'must' be offset, so subtract this from subsequent readings. Take a zero-reading regularly to counteract drift. If this is not possible in your application, you'll need a precision op-amp. They are slightly more expensive and less common, but there are still loads to choose from.
Another thing to remember is the internal acquisition noise of the ADC. Even with a perfectly stable input voltage the LSBs will still be wobbling about on successive samples. Using averaging will counteract this (the acquisition noise actually becomes advantageous). The bandwidth is reduced, but resolution is actually increased. Here's a very useful algorithm:
http://electronics.stackexchange.com/questions/30370/fast-and-memory-efficient-moving-average-calculation