I think both the Foo/Bar and SIMD cases can be addressed by allowing to specify compatibility explicitly and then automatically closing the relation transitively (i.e. if A is manually declared as compatible with B, and B with C, then A becomes compatible with C).
The compatibility specification could either by an explicit trait impl, an attribute on the type or a macro-like syntax.
Could also have a way to say to do as if fields were not public, as a shorthand for declaring compatibility with an identical struct but with public fields.
bool -> int but no int -> bool seems orthogonal, and seems addressable by making Compatible not be reflexive.
Also note that structs with multiple fields without a layout-fixing repr should probably not be compatible with anything other than maybe structs with the exact same contents (and even this would mean giving up the option to do profile-guided struct layout differently for each type, so probably not a good idea).