I do not think either of abhinavmir examples cost more or less. I think they both cost the same.
Variable packing is when you pack several variables that can be added to use 1 memory slot.
A memory slot is a word of 32 bytes.
A string variable will take at least 32 bytes, (+32 bytes again if you go over one 32 bytes limit).
Would work and take only one memory slot.
However a memory slot will always be filled. So if you use a full memory slot for a uint8, the EVM will automatically fill it with empty bytes to fill up the slot.
In this case using a uint256 is cheaper than using a uint8.
is more expensive than 4 uint256.
Using different ints or uints can mainly be for variable packing or limiting the numbers. (Overflow/underflow check...)