Go with sgrif's Fields::iter implementation but without pub(crate)
diff --git a/src/data.rs b/src/data.rs
index b6199a7..4f5b4cb 100644
--- a/src/data.rs
+++ b/src/data.rs
@@ -65,42 +65,24 @@
     }
 }
 
-/// The `Iterator` type returned by [`Fields::iter`].
-///
-/// [`Fields::iter`]: struct.Fields.html#method.iter
-///
-/// *This type is available if Syn is build with the `"derive"` or `"full"`
-/// feature.*
-pub struct FieldsIter<'a>(Option<punctuated::Iter<'a, Field, Token![,]>>);
-
-impl<'a> Iterator for FieldsIter<'a> {
-    type Item = &'a Field;
-    fn next(&mut self) -> Option<&'a Field> {
-        match self.0 {
-            Some(ref mut i) => i.next(),
-            None => None,
-        }
-    }
-}
-
 impl Fields {
     /// Get an iterator over the [`Field`] items in this object. This iterator
     /// can be used to iterate over a named or unnamed struct or variant's
     /// fields uniformly.
     ///
     /// [`Field`]: struct.Field.html
-    pub fn iter(&self) -> FieldsIter {
+    pub fn iter(&self) -> punctuated::Iter<Field, Token![,]> {
         match *self {
-            Fields::Unit => FieldsIter(None),
-            Fields::Named(ref f) => FieldsIter(Some(f.named.iter())),
-            Fields::Unnamed(ref f) => FieldsIter(Some(f.unnamed.iter())),
+            Fields::Unit => punctuated::Iter::private_empty(),
+            Fields::Named(ref f) => f.named.iter(),
+            Fields::Unnamed(ref f) => f.unnamed.iter(),
         }
     }
 }
 
 impl<'a> IntoIterator for &'a Fields {
     type Item = &'a Field;
-    type IntoIter = FieldsIter<'a>;
+    type IntoIter = punctuated::Iter<'a, Field, Token![,]>;
 
     fn into_iter(self) -> Self::IntoIter {
         self.iter()
diff --git a/src/lib.rs b/src/lib.rs
index 380552c..77b0d23 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -287,8 +287,8 @@
 #[cfg(any(feature = "full", feature = "derive"))]
 mod data;
 #[cfg(any(feature = "full", feature = "derive"))]
-pub use data::{Field, Fields, FieldsNamed, FieldsUnnamed, FieldsIter, Variant,
-               VisCrate, VisPublic, VisRestricted, Visibility};
+pub use data::{Field, Fields, FieldsNamed, FieldsUnnamed, Variant, VisCrate, VisPublic,
+               VisRestricted, Visibility};
 
 #[cfg(any(feature = "full", feature = "derive"))]
 mod expr;
diff --git a/src/punctuated.rs b/src/punctuated.rs
index afc163c..a826de5 100644
--- a/src/punctuated.rs
+++ b/src/punctuated.rs
@@ -398,6 +398,17 @@
     inner: slice::Iter<'a, (T, Option<P>)>,
 }
 
+#[cfg(any(feature = "full", feature = "derive"))]
+impl<'a, T, P> Iter<'a, T, P> {
+    // Not public API.
+    #[doc(hidden)]
+    pub fn private_empty() -> Self {
+        Iter {
+            inner: [].iter(),
+        }
+    }
+}
+
 impl<'a, T, P> Iterator for Iter<'a, T, P> {
     type Item = &'a T;