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()