diff --git a/src/lib.rs b/src/lib.rs
index f4de79c50..018f877e5 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -262,7 +262,10 @@ macro_rules! iproduct {
         $crate::__std_iter::once(())
     );
     ($I:expr $(,)?) => (
-        $crate::__std_iter::IntoIterator::into_iter($I).map(|elt| (elt,))
+        $crate::__std_iter::Iterator::map(
+            $crate::__std_iter::IntoIterator::into_iter($I),
+            |elt| (elt,)
+        )
     );
     ($I:expr, $J:expr $(,)?) => (
         $crate::Itertools::cartesian_product(
@@ -330,19 +333,24 @@ macro_rules! izip {
 
     // binary
     ($first:expr, $second:expr $(,)*) => {
-        $crate::izip!($first)
-            .zip($second)
+        $crate::__std_iter::Iterator::zip(
+            $crate::__std_iter::IntoIterator::into_iter($first),
+            $second,
+        )
     };
 
     // n-ary where n > 2
     ( $first:expr $( , $rest:expr )* $(,)* ) => {
-        $crate::izip!($first)
+        {
+            let iter = $crate::__std_iter::IntoIterator::into_iter($first);
             $(
-                .zip($rest)
+                let iter = $crate::__std_iter::Iterator::zip(iter, $rest);
             )*
-            .map(
+            $crate::__std_iter::Iterator::map(
+                iter,
                 $crate::izip!(@closure a => (a) $( , $rest )*)
             )
+        }
     };
 }
 
@@ -393,16 +401,16 @@ macro_rules! izip {
 /// ```
 macro_rules! chain {
     () => {
-        core::iter::empty()
+        $crate::__std_iter::empty()
     };
     ($first:expr $(, $rest:expr )* $(,)?) => {
         {
-            let iter = core::iter::IntoIterator::into_iter($first);
+            let iter = $crate::__std_iter::IntoIterator::into_iter($first);
             $(
                 let iter =
-                    core::iter::Iterator::chain(
+                    $crate::__std_iter::Iterator::chain(
                         iter,
-                        core::iter::IntoIterator::into_iter($rest));
+                        $crate::__std_iter::IntoIterator::into_iter($rest));
             )*
             iter
         }
diff --git a/tests/macros_hygiene.rs b/tests/macros_hygiene.rs
index 20b59fba8..e6e895555 100644
--- a/tests/macros_hygiene.rs
+++ b/tests/macros_hygiene.rs
@@ -1,3 +1,8 @@
+mod alloc {}
+mod core {}
+mod either {}
+mod std {}
+
 #[test]
 fn iproduct_hygiene() {
     let _ = itertools::iproduct!();
@@ -12,3 +17,11 @@ fn izip_hygiene() {
     let _ = itertools::izip!(0..6, 0..9);
     let _ = itertools::izip!(0..6, 0..9, 0..12);
 }
+
+#[test]
+fn chain_hygiene() {
+    let _: ::std::iter::Empty<i32> = itertools::chain!();
+    let _ = itertools::chain!(0..6);
+    let _ = itertools::chain!(0..6, 0..9);
+    let _ = itertools::chain!(0..6, 0..9, 0..12);
+}