Good news! It works! This is what I did...
Determine the internal reference voltage...
1. Upload an empty Sketch
2. Disconnect power from the board
3. Connect a 0.1 uF capacitor from AREF to ground
4. Connect power to the board
5. Upload the following Sketch...
const uint8_t PinLED = 13;
void setup( void )
{
Serial.begin( 38400 );
Serial.println( "\r\n\r\n" );
pinMode( PinLED, OUTPUT );
digitalWrite( PinLED, LOW );
delay( 1000 );
analogReference( INTERNAL );
}
void loop( void )
{
Serial.println( analogRead( 0 ) );
digitalWrite( PinLED, HIGH );
delay( 1000 );
}
6. Wait for a few readings to be displayed in Serial Monitor
7. Measure and record the voltage across the AREF capacitor. In my case the voltage is 1.083.
Use AREF to measure the USB voltage...
1. Upload an empty Sketch
2. Disconnect power from the board
3. Connect a jumper from AREF to +5V
4. Connect power to the board
5. Modify the following Sketch to use your reading from the internal voltage reference and then upload the Sketch.
Note that the value is *1000 with no decimal.
const long InternalReferenceVoltage = 1083L; // <<<<<<<<<< Change this to the reading from your internal voltage reference
void setup( void )
{
Serial.begin( 38400 );
Serial.println( "\r\n\r\n" );
// REFS1 REFS0 --> 0 0 AREF, Internal Vref turned off
// MUX3 MUX2 MUX1 MUX0 --> 1110 1.1V (VBG)
ADMUX = (0<<REFS1) | (0<<REFS0) | (0<<ADLAR) | (1<<MUX3) | (1<<MUX2) | (1<<MUX1) | (0<<MUX0);
}
void loop( void )
{
int value;
// Start a conversion
ADCSRA |= _BV( ADSC );
// Wait for it to complete
while( ( (ADCSRA & (1<<ADSC)) != 0 ) );
// Scale the value
value = (((InternalReferenceVoltage * 1024L) / ADC) + 5L) / 10L;
Serial.println( value );
delay( 1000 );
}
6. Wait for a few readings to be displayed in Serial Monitor
7.
value is the voltage at AREF *100

So no need for external parts.
And, the whole thing can be turned off to reduce power consumption.
So is there a way to allow a sketch to read mux channel 14?
Not directly. The core restricts the value to 0 through 7 for the 328 processor.
Would a new whole function be required to bypass analogRead(),
Switching the analog reference caused problems for me. In my case, switching to AREF and then restoring to the previous value just didn't work. The readings were all over the place. So, in my opinion, a seperate function is needed to ensure a stable reading is returned.
or could the core library for analogRead() be modified?
The modification for the 328 processor is trivial (see below) but I really think something like this should be a separate function.
ADMUX = (analog_reference << 6) | (pin & 0x0F);
One final note: With the Sketch above, my readings have a one bit jitter. I was able to eliminate the jitter and make more accurate readings using noise reduction sleep mode. This has the added benefit of conserving power while the battery is measured. 8-)