Enums always take the same amount of space in memory; they do not change size based on what case is currently active (some of the bytes just get treated as padding instead). So saying “this case should be zero bytes and untagged” (a) means you can’t look at an enum value and tell if it’s in that case (since you said “untagged”), and (b) does absolutely nothing to change the overall size of an enum value.
You could have a different hypothetical language feature with “unsized enums” represented with fat pointers, where the metadata part of the pointer stored the tag. But even then it would be a tag and not a size, because otherwise you wouldn’t be able to differentiate between two cases whose payloads have the same size.
I agree, differentiation would be required. Perhaps it would work only for enums with sizes below 3? As Option<T> can be treated simply as a T. Perhaps we could have that for other enums?