NonZero uses compiler magic #[rustc_nonnull_optimization_guaranteed] to let the zero value to be unused. This affects type layouts and could cause problems if you wrapped a type that needs to use zero values.
Saturating is purely a transparent wrapper. In Rust, structs usually don't have any type bounds unless necessary, because these bounds need to be repeated in many places. Bounds on impl are usually sufficient and don't spread to every use of the struct.