The object header consists of two fields: syncblk and a pointer to the method table (aka "type descriptor"). The second field is easy to understand, this is a pointer, so it should grow from 4 to 8 bytes in 64-bit mode.
Syncblk is a much less obvious case, it is a combination of flags and values (owner lock thread identifier, hash code, synchronization block index). There is no reason to increase it in 64-bit mode. What matters is what happens after the object is assembled by the GC. If the free space was not eliminated by compacting the heap, then the object space is included in the list of free blocks. Works like a double list. The second field is a direct pointer to the next free block. The data space of the object is used to store the size of the free block, the main reason why the object is at least 12 bytes. And syncblk saves the back pointer to the previous free block. So now it should be large enough to hold the pointer and therefore should grow to 8 bytes. So this is 8 + 8 = 16 bytes.
Fwiw, 64- 24 , 8 + 8 + 4 = 20 , , 8. , 'd , L1. 3 . <gcAllowVeryLargeObjects> - , .