#[repr(transparent)] struct around one of the types in this list.
Missing from this is the possibility of having an enum E { ... } such that Option<E> would have the same size as E. In the vast majority of cases, some values of the discriminant field of an enum are not utilized and could be co-opted by Option to indicate the lack of a value.
Such an optimization is not only considered but also already applied. However it is not guaranteed in a way that unsafe code (like mem::transmute) can rely on it or you can be 100% certain (as opposed to only 99.99% certain) that it will always stay optimized this way in the future.
enum Foo { First, Second, Third }
enum Bar { SomeBar(u8), NoneBar, OtherNoneBar }
use std::mem::size_of;
fn main() {
dbg!(size_of::<Foo>());
dbg!(size_of::<Option<Foo>>());
dbg!(size_of::<Bar>());
dbg!(size_of::<Option<Bar>>());
eprintln!("and even:");
dbg!(size_of::<Foo>());
dbg!(size_of::<Option<Option<Option<Option<Foo>>>>>());
dbg!(size_of::<Bar>());
dbg!(size_of::<Option<Option<Option<Option<Bar>>>>>());
}