Represent `crate` visibility specifier
diff --git a/src/data.rs b/src/data.rs
index 9df229b..be52452 100644
--- a/src/data.rs
+++ b/src/data.rs
@@ -139,8 +139,6 @@
         /// *This type is available if Syn is built with the `"derive"` or
         /// `"full"` feature.*
         pub Crate(VisCrate {
-            pub pub_token: Token![pub],
-            pub paren_token: token::Paren,
             pub crate_token: Token![crate],
         }),
 
@@ -255,17 +253,16 @@
             do_parse!(
                 pub_token: keyword!(pub) >>
                 other: parens!(keyword!(crate)) >>
-                (Visibility::Crate(VisCrate {
+                (Visibility::Restricted(VisRestricted {
                     pub_token: pub_token,
                     paren_token: other.0,
-                    crate_token: other.1,
+                    in_token: None,
+                    path: Box::new(other.1.into()),
                 }))
             )
             |
             keyword!(crate) => { |tok| {
                 Visibility::Crate(VisCrate {
-                    pub_token: <Token![pub]>::default(),
-                    paren_token: token::Paren::default(),
                     crate_token: tok,
                 })
             } }
@@ -375,10 +372,7 @@
 
     impl ToTokens for VisCrate {
         fn to_tokens(&self, tokens: &mut Tokens) {
-            self.pub_token.to_tokens(tokens);
-            self.paren_token.surround(tokens, |tokens| {
-                self.crate_token.to_tokens(tokens);
-            })
+            self.crate_token.to_tokens(tokens);
         }
     }
 
@@ -386,8 +380,8 @@
         fn to_tokens(&self, tokens: &mut Tokens) {
             self.pub_token.to_tokens(tokens);
             self.paren_token.surround(tokens, |tokens| {
-                // XXX: If we have a path which is not "self" or "super",
-                // automatically add the "in" token.
+                // XXX: If we have a path which is not "self" or "super" or
+                // "crate", automatically add the "in" token.
                 self.in_token.to_tokens(tokens);
                 self.path.to_tokens(tokens);
             });
diff --git a/src/gen/fold.rs b/src/gen/fold.rs
index 3d0dde7..30b6e5b 100644
--- a/src/gen/fold.rs
+++ b/src/gen/fold.rs
@@ -2875,8 +2875,6 @@
 # [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
 pub fn fold_vis_crate<V: Fold + ?Sized>(_visitor: &mut V, _i: VisCrate) -> VisCrate {
     VisCrate {
-        pub_token: Token ! [ pub ](tokens_helper(_visitor, &(_i . pub_token).0)),
-        paren_token: Paren(tokens_helper(_visitor, &(_i . paren_token).0)),
         crate_token: Token ! [ crate ](tokens_helper(_visitor, &(_i . crate_token).0)),
     }
 }
diff --git a/src/gen/visit.rs b/src/gen/visit.rs
index 6205c54..c5116ff 100644
--- a/src/gen/visit.rs
+++ b/src/gen/visit.rs
@@ -2217,8 +2217,6 @@
 }
 # [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
 pub fn visit_vis_crate<'ast, V: Visit<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast VisCrate) {
-    tokens_helper(_visitor, &(& _i . pub_token).0);
-    tokens_helper(_visitor, &(& _i . paren_token).0);
     tokens_helper(_visitor, &(& _i . crate_token).0);
 }
 # [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
diff --git a/src/gen/visit_mut.rs b/src/gen/visit_mut.rs
index 202f2d9..c262c74 100644
--- a/src/gen/visit_mut.rs
+++ b/src/gen/visit_mut.rs
@@ -2218,8 +2218,6 @@
 }
 # [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
 pub fn visit_vis_crate_mut<V: VisitMut + ?Sized>(_visitor: &mut V, _i: &mut VisCrate) {
-    tokens_helper(_visitor, &mut (& mut _i . pub_token).0);
-    tokens_helper(_visitor, &mut (& mut _i . paren_token).0);
     tokens_helper(_visitor, &mut (& mut _i . crate_token).0);
 }
 # [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
diff --git a/tests/test_derive_input.rs b/tests/test_derive_input.rs
index bd25652..460e9ca 100644
--- a/tests/test_derive_input.rs
+++ b/tests/test_derive_input.rs
@@ -536,6 +536,31 @@
 }
 
 #[test]
+fn test_vis_crate() {
+    let raw = r#"
+        crate struct S;
+    "#;
+
+    let expected = DeriveInput {
+        ident: "S".into(),
+        vis: Visibility::Crate(VisCrate {
+            crate_token: Default::default(),
+        }),
+        attrs: vec![],
+        generics: Generics::default(),
+        data: Data::Struct(DataStruct {
+            semi_token: Some(Default::default()),
+            struct_token: Default::default(),
+            fields: Fields::Unit,
+        }),
+    };
+
+    let actual = syn::parse_str(raw).unwrap();
+
+    assert_eq!(expected, actual);
+}
+
+#[test]
 fn test_pub_restricted_crate() {
     let raw = r#"
         pub(crate) struct S;
@@ -543,10 +568,11 @@
 
     let expected = DeriveInput {
         ident: "S".into(),
-        vis: Visibility::Crate(VisCrate {
+        vis: Visibility::Restricted(VisRestricted {
             pub_token: Default::default(),
-            crate_token: Default::default(),
             paren_token: Default::default(),
+            in_token: None,
+            path: Box::new("crate".into()),
         }),
         attrs: vec![],
         generics: Generics::default(),