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" ) ) ]