Yes, 8 bits is the minimum one can use for a primitive type.
However, you can still implement bit-packed data structures like BitArray or DBitVector as linked above. The way these works is to have arrays of e.g. UInt64 “chunks” (64-bit quantities) under the hood, but to provide accessor functions (e.g. getindex) that extract individual 1-bit or 2-bit elements from the bits of these “chunks”, respectively.