Andy2No:
Thanks, Nick. I've ordered a couple of cheap ATmega168 boards based on the Arduino Mini, which also have A6 and A7. Would those be addressed as 20 and 21, following on from A5=19? I guess I'll find that out anyway.
I left out those two lines so I wouldn't confuse you. 
const static uint8_t A0 = 14;
const static uint8_t A1 = 15;
const static uint8_t A2 = 16;
const static uint8_t A3 = 17;
const static uint8_t A4 = 18;
const static uint8_t A5 = 19;
const static uint8_t A6 = 20;
const static uint8_t A7 = 21;
"Use the Source, Luke!".
Looking at the .h file, it uses bitWrite(). I can see lots of references to that in the forum, but I can't find any official documentation for it.
#ifndef digitalWriteFast
#define digitalWriteFast(P, V) \
do { \
if (__builtin_constant_p(P) && __builtin_constant_p(V)) __atomicWrite__((uint8_t*) digitalPinToPortReg(P),P,V) \
else digitalWrite((P), (V)); \
}while (0)
#endif //#ifndef digitalWriteFast2
It appears to use a compiler trick, which is to examine the arguments, and if they are constants, use the constant method (the fast one) otherwise use the slow one.
Look, it's all very well wanting to be "fast" but for most applications it just isn't required. Sure, there will be counter examples, but for the most part, no. I use port manipulation as a last resort (eg. when clocking out bits for a VGA monitor, where nanonseconds count).
Is this the datasheet you're referring to, Nick, or is there a more detailed one somewhere?
The official Atmega328 datasheet should be your friend:
http://atmel.com/dyn/resources/prod_documents/8271S.pdf