diff --git a/src/libcore/num/mod.rs b/src/libcore/num/mod.rs
index b5d61a3fd4e78..f0a8b801ccd29 100644
--- a/src/libcore/num/mod.rs
+++ b/src/libcore/num/mod.rs
@@ -134,6 +134,83 @@ macro_rules! from_str_radix_nzint_impl {
 from_str_radix_nzint_impl! { NonZeroU8 NonZeroU16 NonZeroU32 NonZeroU64 NonZeroU128 NonZeroUsize
                              NonZeroI8 NonZeroI16 NonZeroI32 NonZeroI64 NonZeroI128 NonZeroIsize }
 
+// Conversion traits for NonZero integer types to wider NonZero types
+macro_rules! impl_nz_from_nz {
+    ($Small: ty, $Large: ty, $LargePrimitive: ty, #[$attr:meta], $doc: expr) => {
+        #[$attr]
+        #[doc = $doc]
+        impl From<$Small> for $Large {
+            #[inline]
+            fn from(small: $Small) -> $Large {
+                // SAFETY: we already know a NonZero will not contain a zero
+                unsafe {
+                    <$Large>::new_unchecked(small.get() as $LargePrimitive)
+                }
+            }
+        }
+    };
+    ($Small: ty, $Large: ty, $LargePrimitive: ty, #[$attr:meta]) => {
+        impl_nz_from_nz!($Small,
+                   $Large,
+                   $LargePrimitive,
+                   #[$attr],
+                   concat!("Converts `",
+                           stringify!($Small),
+                           "` to `",
+                           stringify!($Large),
+                           "` losslessly.
+
+```rust
+let small = core::num::", stringify!($Small), "::new(5).unwrap();
+let big: core::num::", stringify!($Large), " = small.into();
+"));
+    }
+}
+
+// NonZeroUnsigned -> NonZeroUnsigned wider
+impl_nz_from_nz! { NonZeroU8, NonZeroU16, u16,
+    #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] }
+impl_nz_from_nz! { NonZeroU8, NonZeroU32, u32,
+    #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] }
+impl_nz_from_nz! { NonZeroU8, NonZeroU64, u64,
+    #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] }
+impl_nz_from_nz! { NonZeroU8, NonZeroU128, u128,
+    #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] }
+impl_nz_from_nz! { NonZeroU16, NonZeroU32, u32,
+    #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] }
+impl_nz_from_nz! { NonZeroU16, NonZeroU64, u64,
+    #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] }
+impl_nz_from_nz! { NonZeroU16, NonZeroU128, u128,
+    #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] }
+impl_nz_from_nz! { NonZeroU32, NonZeroU64, u64,
+    #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] }
+impl_nz_from_nz! { NonZeroU32, NonZeroU128, u128,
+    #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] }
+impl_nz_from_nz! { NonZeroU64, NonZeroU128, u128,
+    #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] }
+
+// NonZeroSigned -> NonZeroSigned wider
+impl_nz_from_nz! { NonZeroI8, NonZeroI16, i16,
+    #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] }
+impl_nz_from_nz! { NonZeroI8, NonZeroI32, i32,
+    #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] }
+impl_nz_from_nz! { NonZeroI8, NonZeroI64, i64,
+    #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] }
+impl_nz_from_nz! { NonZeroI8, NonZeroI128, i128,
+    #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] }
+impl_nz_from_nz! { NonZeroI16, NonZeroI32, i32,
+    #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] }
+impl_nz_from_nz! { NonZeroI16, NonZeroI64, i64,
+    #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] }
+impl_nz_from_nz! { NonZeroI16, NonZeroI128, i128,
+    #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] }
+impl_nz_from_nz! { NonZeroI32, NonZeroI64, i64,
+    #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] }
+impl_nz_from_nz! { NonZeroI32, NonZeroI128, i128,
+    #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] }
+impl_nz_from_nz! { NonZeroI64, NonZeroI128, i128,
+    #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] }
+
 /// Provides intentionally-wrapped arithmetic on `T`.
 ///
 /// Operations like `+` on `u32` values is intended to never overflow,