You need to advance position, right?:
{code}
    byte lookAhead() throws IOException {
        if(head == READ_NEXT) {
            if(ensure(1)) {
                head = buffer.getByte(position);
                position++;
            }
        }
        return head;
    }
{code}

Then `consume`, `skipValueWithSwitch` doesn't need to call consume() after lookAhead().
`unpackNil`, `unpackBoolean`,  just needs to reset `head` rather than calling `consume()`.
`unpackByte` should call `lookAhead()` rather than `consume()`, etc...