Inline constness, defaultness, impl polarity
diff --git a/src/gen/fold.rs b/src/gen/fold.rs
index 0e93754..3132fd4 100644
--- a/src/gen/fold.rs
+++ b/src/gen/fold.rs
@@ -77,10 +77,6 @@
 fn fold_bound_lifetimes(&mut self, i: BoundLifetimes) -> BoundLifetimes { fold_bound_lifetimes(self, i) }
 
 fn fold_const_param(&mut self, i: ConstParam) -> ConstParam { fold_const_param(self, i) }
-# [ cfg ( feature = "full" ) ]
-fn fold_constness(&mut self, i: Constness) -> Constness { fold_constness(self, i) }
-# [ cfg ( feature = "full" ) ]
-fn fold_defaultness(&mut self, i: Defaultness) -> Defaultness { fold_defaultness(self, i) }
 
 fn fold_derive_input(&mut self, i: DeriveInput) -> DeriveInput { fold_derive_input(self, i) }
 
@@ -203,8 +199,6 @@
 fn fold_impl_item_method(&mut self, i: ImplItemMethod) -> ImplItemMethod { fold_impl_item_method(self, i) }
 # [ cfg ( feature = "full" ) ]
 fn fold_impl_item_type(&mut self, i: ImplItemType) -> ImplItemType { fold_impl_item_type(self, i) }
-# [ cfg ( feature = "full" ) ]
-fn fold_impl_polarity(&mut self, i: ImplPolarity) -> ImplPolarity { fold_impl_polarity(self, i) }
 
 fn fold_index(&mut self, i: Index) -> Index { fold_index(self, i) }
 # [ cfg ( feature = "full" ) ]
@@ -736,30 +730,6 @@
         default: (_i . default).map(|it| { _visitor.fold_expr(it) }),
     }
 }
-# [ cfg ( feature = "full" ) ]
-pub fn fold_constness<V: Folder + ?Sized>(_visitor: &mut V, _i: Constness) -> Constness {
-    use ::Constness::*;
-    match _i {
-        Const(_binding_0, ) => {
-            Const (
-                Token ! [ const ](tokens_helper(_visitor, &(_binding_0).0)),
-            )
-        }
-        NotConst => { NotConst }
-    }
-}
-# [ cfg ( feature = "full" ) ]
-pub fn fold_defaultness<V: Folder + ?Sized>(_visitor: &mut V, _i: Defaultness) -> Defaultness {
-    use ::Defaultness::*;
-    match _i {
-        Default(_binding_0, ) => {
-            Default (
-                Token ! [ default ](tokens_helper(_visitor, &(_binding_0).0)),
-            )
-        }
-        Final => { Final }
-    }
-}
 
 pub fn fold_derive_input<V: Folder + ?Sized>(_visitor: &mut V, _i: DeriveInput) -> DeriveInput {
     DeriveInput {
@@ -1572,7 +1542,7 @@
     ImplItemConst {
         attrs: FoldHelper::lift(_i . attrs, |it| { _visitor.fold_attribute(it) }),
         vis: _visitor.fold_visibility(_i . vis),
-        defaultness: _visitor.fold_defaultness(_i . defaultness),
+        defaultness: (_i . defaultness).map(|it| { Token ! [ default ](tokens_helper(_visitor, &(it).0)) }),
         const_token: Token ! [ const ](tokens_helper(_visitor, &(_i . const_token).0)),
         ident: _visitor.fold_ident(_i . ident),
         colon_token: Token ! [ : ](tokens_helper(_visitor, &(_i . colon_token).0)),
@@ -1595,7 +1565,7 @@
     ImplItemMethod {
         attrs: FoldHelper::lift(_i . attrs, |it| { _visitor.fold_attribute(it) }),
         vis: _visitor.fold_visibility(_i . vis),
-        defaultness: _visitor.fold_defaultness(_i . defaultness),
+        defaultness: (_i . defaultness).map(|it| { Token ! [ default ](tokens_helper(_visitor, &(it).0)) }),
         sig: _visitor.fold_method_sig(_i . sig),
         block: _visitor.fold_block(_i . block),
     }
@@ -1605,7 +1575,7 @@
     ImplItemType {
         attrs: FoldHelper::lift(_i . attrs, |it| { _visitor.fold_attribute(it) }),
         vis: _visitor.fold_visibility(_i . vis),
-        defaultness: _visitor.fold_defaultness(_i . defaultness),
+        defaultness: (_i . defaultness).map(|it| { Token ! [ default ](tokens_helper(_visitor, &(it).0)) }),
         type_token: Token ! [ type ](tokens_helper(_visitor, &(_i . type_token).0)),
         ident: _visitor.fold_ident(_i . ident),
         generics: _visitor.fold_generics(_i . generics),
@@ -1614,18 +1584,6 @@
         semi_token: Token ! [ ; ](tokens_helper(_visitor, &(_i . semi_token).0)),
     }
 }
-# [ cfg ( feature = "full" ) ]
-pub fn fold_impl_polarity<V: Folder + ?Sized>(_visitor: &mut V, _i: ImplPolarity) -> ImplPolarity {
-    use ::ImplPolarity::*;
-    match _i {
-        Positive => { Positive }
-        Negative(_binding_0, ) => {
-            Negative (
-                Token ! [ ! ](tokens_helper(_visitor, &(_binding_0).0)),
-            )
-        }
-    }
-}
 
 pub fn fold_index<V: Folder + ?Sized>(_visitor: &mut V, _i: Index) -> Index {
     Index {
@@ -1777,7 +1735,7 @@
     ItemFn {
         attrs: FoldHelper::lift(_i . attrs, |it| { _visitor.fold_attribute(it) }),
         vis: _visitor.fold_visibility(_i . vis),
-        constness: _visitor.fold_constness(_i . constness),
+        constness: (_i . constness).map(|it| { Token ! [ const ](tokens_helper(_visitor, &(it).0)) }),
         unsafety: _visitor.fold_unsafety(_i . unsafety),
         abi: (_i . abi).map(|it| { _visitor.fold_abi(it) }),
         ident: _visitor.fold_ident(_i . ident),
@@ -1798,12 +1756,12 @@
 pub fn fold_item_impl<V: Folder + ?Sized>(_visitor: &mut V, _i: ItemImpl) -> ItemImpl {
     ItemImpl {
         attrs: FoldHelper::lift(_i . attrs, |it| { _visitor.fold_attribute(it) }),
-        defaultness: _visitor.fold_defaultness(_i . defaultness),
+        defaultness: (_i . defaultness).map(|it| { Token ! [ default ](tokens_helper(_visitor, &(it).0)) }),
         unsafety: _visitor.fold_unsafety(_i . unsafety),
         impl_token: Token ! [ impl ](tokens_helper(_visitor, &(_i . impl_token).0)),
         generics: _visitor.fold_generics(_i . generics),
         trait_: (_i . trait_).map(|it| { (
-            _visitor.fold_impl_polarity(( it ) . 0),
+            (( it ) . 0).map(|it| { Token ! [ ! ](tokens_helper(_visitor, &(it).0)) }),
             _visitor.fold_path(( it ) . 1),
             Token ! [ for ](tokens_helper(_visitor, &(( it ) . 2).0)),
         ) }),
@@ -2018,7 +1976,7 @@
 # [ cfg ( feature = "full" ) ]
 pub fn fold_method_sig<V: Folder + ?Sized>(_visitor: &mut V, _i: MethodSig) -> MethodSig {
     MethodSig {
-        constness: _visitor.fold_constness(_i . constness),
+        constness: (_i . constness).map(|it| { Token ! [ const ](tokens_helper(_visitor, &(it).0)) }),
         unsafety: _visitor.fold_unsafety(_i . unsafety),
         abi: (_i . abi).map(|it| { _visitor.fold_abi(it) }),
         ident: _visitor.fold_ident(_i . ident),
diff --git a/src/gen/visit.rs b/src/gen/visit.rs
index 2f3f414..9ab94cb 100644
--- a/src/gen/visit.rs
+++ b/src/gen/visit.rs
@@ -73,10 +73,6 @@
 fn visit_bound_lifetimes(&mut self, i: &'ast BoundLifetimes) { visit_bound_lifetimes(self, i) }
 
 fn visit_const_param(&mut self, i: &'ast ConstParam) { visit_const_param(self, i) }
-# [ cfg ( feature = "full" ) ]
-fn visit_constness(&mut self, i: &'ast Constness) { visit_constness(self, i) }
-# [ cfg ( feature = "full" ) ]
-fn visit_defaultness(&mut self, i: &'ast Defaultness) { visit_defaultness(self, i) }
 
 fn visit_derive_input(&mut self, i: &'ast DeriveInput) { visit_derive_input(self, i) }
 
@@ -199,8 +195,6 @@
 fn visit_impl_item_method(&mut self, i: &'ast ImplItemMethod) { visit_impl_item_method(self, i) }
 # [ cfg ( feature = "full" ) ]
 fn visit_impl_item_type(&mut self, i: &'ast ImplItemType) { visit_impl_item_type(self, i) }
-# [ cfg ( feature = "full" ) ]
-fn visit_impl_polarity(&mut self, i: &'ast ImplPolarity) { visit_impl_polarity(self, i) }
 
 fn visit_index(&mut self, i: &'ast Index) { visit_index(self, i) }
 # [ cfg ( feature = "full" ) ]
@@ -626,26 +620,6 @@
     if let Some(ref it) = _i . eq_token { tokens_helper(_visitor, &(it).0) };
     if let Some(ref it) = _i . default { _visitor.visit_expr(it) };
 }
-# [ cfg ( feature = "full" ) ]
-pub fn visit_constness<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast Constness) {
-    use ::Constness::*;
-    match *_i {
-        Const(ref _binding_0, ) => {
-            tokens_helper(_visitor, &(_binding_0).0);
-        }
-        NotConst => { }
-    }
-}
-# [ cfg ( feature = "full" ) ]
-pub fn visit_defaultness<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast Defaultness) {
-    use ::Defaultness::*;
-    match *_i {
-        Default(ref _binding_0, ) => {
-            tokens_helper(_visitor, &(_binding_0).0);
-        }
-        Final => { }
-    }
-}
 
 pub fn visit_derive_input<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast DeriveInput) {
     for it in & _i . attrs { _visitor.visit_attribute(it) };
@@ -1244,7 +1218,7 @@
 pub fn visit_impl_item_const<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast ImplItemConst) {
     for it in & _i . attrs { _visitor.visit_attribute(it) };
     _visitor.visit_visibility(& _i . vis);
-    _visitor.visit_defaultness(& _i . defaultness);
+    if let Some(ref it) = _i . defaultness { tokens_helper(_visitor, &(it).0) };
     tokens_helper(_visitor, &(& _i . const_token).0);
     _visitor.visit_ident(& _i . ident);
     tokens_helper(_visitor, &(& _i . colon_token).0);
@@ -1263,7 +1237,7 @@
 pub fn visit_impl_item_method<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast ImplItemMethod) {
     for it in & _i . attrs { _visitor.visit_attribute(it) };
     _visitor.visit_visibility(& _i . vis);
-    _visitor.visit_defaultness(& _i . defaultness);
+    if let Some(ref it) = _i . defaultness { tokens_helper(_visitor, &(it).0) };
     _visitor.visit_method_sig(& _i . sig);
     _visitor.visit_block(& _i . block);
 }
@@ -1271,7 +1245,7 @@
 pub fn visit_impl_item_type<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast ImplItemType) {
     for it in & _i . attrs { _visitor.visit_attribute(it) };
     _visitor.visit_visibility(& _i . vis);
-    _visitor.visit_defaultness(& _i . defaultness);
+    if let Some(ref it) = _i . defaultness { tokens_helper(_visitor, &(it).0) };
     tokens_helper(_visitor, &(& _i . type_token).0);
     _visitor.visit_ident(& _i . ident);
     _visitor.visit_generics(& _i . generics);
@@ -1279,16 +1253,6 @@
     _visitor.visit_type(& _i . ty);
     tokens_helper(_visitor, &(& _i . semi_token).0);
 }
-# [ cfg ( feature = "full" ) ]
-pub fn visit_impl_polarity<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast ImplPolarity) {
-    use ::ImplPolarity::*;
-    match *_i {
-        Positive => { }
-        Negative(ref _binding_0, ) => {
-            tokens_helper(_visitor, &(_binding_0).0);
-        }
-    }
-}
 
 pub fn visit_index<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast Index) {
     // Skipped field _i . index;
@@ -1397,7 +1361,7 @@
 pub fn visit_item_fn<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast ItemFn) {
     for it in & _i . attrs { _visitor.visit_attribute(it) };
     _visitor.visit_visibility(& _i . vis);
-    _visitor.visit_constness(& _i . constness);
+    if let Some(ref it) = _i . constness { tokens_helper(_visitor, &(it).0) };
     _visitor.visit_unsafety(& _i . unsafety);
     if let Some(ref it) = _i . abi { _visitor.visit_abi(it) };
     _visitor.visit_ident(& _i . ident);
@@ -1414,12 +1378,12 @@
 # [ cfg ( feature = "full" ) ]
 pub fn visit_item_impl<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast ItemImpl) {
     for it in & _i . attrs { _visitor.visit_attribute(it) };
-    _visitor.visit_defaultness(& _i . defaultness);
+    if let Some(ref it) = _i . defaultness { tokens_helper(_visitor, &(it).0) };
     _visitor.visit_unsafety(& _i . unsafety);
     tokens_helper(_visitor, &(& _i . impl_token).0);
     _visitor.visit_generics(& _i . generics);
     if let Some(ref it) = _i . trait_ { 
-            _visitor.visit_impl_polarity(& ( it ) . 0);
+            if let Some(ref it) = ( it ) . 0 { tokens_helper(_visitor, &(it).0) };
             _visitor.visit_path(& ( it ) . 1);
             tokens_helper(_visitor, &(& ( it ) . 2).0);
          };
@@ -1597,7 +1561,7 @@
 }
 # [ cfg ( feature = "full" ) ]
 pub fn visit_method_sig<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast MethodSig) {
-    _visitor.visit_constness(& _i . constness);
+    if let Some(ref it) = _i . constness { tokens_helper(_visitor, &(it).0) };
     _visitor.visit_unsafety(& _i . unsafety);
     if let Some(ref it) = _i . abi { _visitor.visit_abi(it) };
     _visitor.visit_ident(& _i . ident);
diff --git a/src/gen/visit_mut.rs b/src/gen/visit_mut.rs
index a9dc75a..e879222 100644
--- a/src/gen/visit_mut.rs
+++ b/src/gen/visit_mut.rs
@@ -73,10 +73,6 @@
 fn visit_bound_lifetimes_mut(&mut self, i: &mut BoundLifetimes) { visit_bound_lifetimes_mut(self, i) }
 
 fn visit_const_param_mut(&mut self, i: &mut ConstParam) { visit_const_param_mut(self, i) }
-# [ cfg ( feature = "full" ) ]
-fn visit_constness_mut(&mut self, i: &mut Constness) { visit_constness_mut(self, i) }
-# [ cfg ( feature = "full" ) ]
-fn visit_defaultness_mut(&mut self, i: &mut Defaultness) { visit_defaultness_mut(self, i) }
 
 fn visit_derive_input_mut(&mut self, i: &mut DeriveInput) { visit_derive_input_mut(self, i) }
 
@@ -199,8 +195,6 @@
 fn visit_impl_item_method_mut(&mut self, i: &mut ImplItemMethod) { visit_impl_item_method_mut(self, i) }
 # [ cfg ( feature = "full" ) ]
 fn visit_impl_item_type_mut(&mut self, i: &mut ImplItemType) { visit_impl_item_type_mut(self, i) }
-# [ cfg ( feature = "full" ) ]
-fn visit_impl_polarity_mut(&mut self, i: &mut ImplPolarity) { visit_impl_polarity_mut(self, i) }
 
 fn visit_index_mut(&mut self, i: &mut Index) { visit_index_mut(self, i) }
 # [ cfg ( feature = "full" ) ]
@@ -626,26 +620,6 @@
     if let Some(ref mut it) = _i . eq_token { tokens_helper(_visitor, &mut (it).0) };
     if let Some(ref mut it) = _i . default { _visitor.visit_expr_mut(it) };
 }
-# [ cfg ( feature = "full" ) ]
-pub fn visit_constness_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut Constness) {
-    use ::Constness::*;
-    match *_i {
-        Const(ref mut _binding_0, ) => {
-            tokens_helper(_visitor, &mut (_binding_0).0);
-        }
-        NotConst => { }
-    }
-}
-# [ cfg ( feature = "full" ) ]
-pub fn visit_defaultness_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut Defaultness) {
-    use ::Defaultness::*;
-    match *_i {
-        Default(ref mut _binding_0, ) => {
-            tokens_helper(_visitor, &mut (_binding_0).0);
-        }
-        Final => { }
-    }
-}
 
 pub fn visit_derive_input_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut DeriveInput) {
     for it in & mut _i . attrs { _visitor.visit_attribute_mut(it) };
@@ -1244,7 +1218,7 @@
 pub fn visit_impl_item_const_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut ImplItemConst) {
     for it in & mut _i . attrs { _visitor.visit_attribute_mut(it) };
     _visitor.visit_visibility_mut(& mut _i . vis);
-    _visitor.visit_defaultness_mut(& mut _i . defaultness);
+    if let Some(ref mut it) = _i . defaultness { tokens_helper(_visitor, &mut (it).0) };
     tokens_helper(_visitor, &mut (& mut _i . const_token).0);
     _visitor.visit_ident_mut(& mut _i . ident);
     tokens_helper(_visitor, &mut (& mut _i . colon_token).0);
@@ -1263,7 +1237,7 @@
 pub fn visit_impl_item_method_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut ImplItemMethod) {
     for it in & mut _i . attrs { _visitor.visit_attribute_mut(it) };
     _visitor.visit_visibility_mut(& mut _i . vis);
-    _visitor.visit_defaultness_mut(& mut _i . defaultness);
+    if let Some(ref mut it) = _i . defaultness { tokens_helper(_visitor, &mut (it).0) };
     _visitor.visit_method_sig_mut(& mut _i . sig);
     _visitor.visit_block_mut(& mut _i . block);
 }
@@ -1271,7 +1245,7 @@
 pub fn visit_impl_item_type_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut ImplItemType) {
     for it in & mut _i . attrs { _visitor.visit_attribute_mut(it) };
     _visitor.visit_visibility_mut(& mut _i . vis);
-    _visitor.visit_defaultness_mut(& mut _i . defaultness);
+    if let Some(ref mut it) = _i . defaultness { tokens_helper(_visitor, &mut (it).0) };
     tokens_helper(_visitor, &mut (& mut _i . type_token).0);
     _visitor.visit_ident_mut(& mut _i . ident);
     _visitor.visit_generics_mut(& mut _i . generics);
@@ -1279,16 +1253,6 @@
     _visitor.visit_type_mut(& mut _i . ty);
     tokens_helper(_visitor, &mut (& mut _i . semi_token).0);
 }
-# [ cfg ( feature = "full" ) ]
-pub fn visit_impl_polarity_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut ImplPolarity) {
-    use ::ImplPolarity::*;
-    match *_i {
-        Positive => { }
-        Negative(ref mut _binding_0, ) => {
-            tokens_helper(_visitor, &mut (_binding_0).0);
-        }
-    }
-}
 
 pub fn visit_index_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut Index) {
     // Skipped field _i . index;
@@ -1397,7 +1361,7 @@
 pub fn visit_item_fn_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut ItemFn) {
     for it in & mut _i . attrs { _visitor.visit_attribute_mut(it) };
     _visitor.visit_visibility_mut(& mut _i . vis);
-    _visitor.visit_constness_mut(& mut _i . constness);
+    if let Some(ref mut it) = _i . constness { tokens_helper(_visitor, &mut (it).0) };
     _visitor.visit_unsafety_mut(& mut _i . unsafety);
     if let Some(ref mut it) = _i . abi { _visitor.visit_abi_mut(it) };
     _visitor.visit_ident_mut(& mut _i . ident);
@@ -1414,12 +1378,12 @@
 # [ cfg ( feature = "full" ) ]
 pub fn visit_item_impl_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut ItemImpl) {
     for it in & mut _i . attrs { _visitor.visit_attribute_mut(it) };
-    _visitor.visit_defaultness_mut(& mut _i . defaultness);
+    if let Some(ref mut it) = _i . defaultness { tokens_helper(_visitor, &mut (it).0) };
     _visitor.visit_unsafety_mut(& mut _i . unsafety);
     tokens_helper(_visitor, &mut (& mut _i . impl_token).0);
     _visitor.visit_generics_mut(& mut _i . generics);
     if let Some(ref mut it) = _i . trait_ { 
-            _visitor.visit_impl_polarity_mut(& mut ( it ) . 0);
+            if let Some(ref mut it) = ( it ) . 0 { tokens_helper(_visitor, &mut (it).0) };
             _visitor.visit_path_mut(& mut ( it ) . 1);
             tokens_helper(_visitor, &mut (& mut ( it ) . 2).0);
          };
@@ -1597,7 +1561,7 @@
 }
 # [ cfg ( feature = "full" ) ]
 pub fn visit_method_sig_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut MethodSig) {
-    _visitor.visit_constness_mut(& mut _i . constness);
+    if let Some(ref mut it) = _i . constness { tokens_helper(_visitor, &mut (it).0) };
     _visitor.visit_unsafety_mut(& mut _i . unsafety);
     if let Some(ref mut it) = _i . abi { _visitor.visit_abi_mut(it) };
     _visitor.visit_ident_mut(& mut _i . ident);
diff --git a/src/item.rs b/src/item.rs
index 96655cf..1151ed4 100644
--- a/src/item.rs
+++ b/src/item.rs
@@ -69,7 +69,7 @@
         pub Fn(ItemFn {
             pub attrs: Vec<Attribute>,
             pub vis: Visibility,
-            pub constness: Constness,
+            pub constness: Option<Token![const]>,
             pub unsafety: Unsafety,
             pub abi: Option<Abi>,
             pub ident: Ident,
@@ -177,12 +177,12 @@
         /// E.g. `impl<A> Foo<A> { .. }` or `impl<A> Trait for Foo<A> { .. }`
         pub Impl(ItemImpl {
             pub attrs: Vec<Attribute>,
-            pub defaultness: Defaultness,
+            pub defaultness: Option<Token![default]>,
             pub unsafety: Unsafety,
             pub impl_token: Token![impl],
             pub generics: Generics,
             /// Trait this impl implements.
-            pub trait_: Option<(ImplPolarity, Path, Token![for])>,
+            pub trait_: Option<(Option<Token![!]>, Path, Token![for])>,
             /// The Self type of the impl.
             pub self_ty: Box<Type>,
             pub brace_token: token::Brace,
@@ -283,22 +283,6 @@
     }
 }
 
-ast_enum! {
-    #[cfg_attr(feature = "clone-impls", derive(Copy))]
-    pub enum Constness {
-        Const(Token![const]),
-        NotConst,
-    }
-}
-
-ast_enum! {
-    #[cfg_attr(feature = "clone-impls", derive(Copy))]
-    pub enum Defaultness {
-        Default(Token![default]),
-        Final,
-    }
-}
-
 ast_enum_of_structs! {
     /// An item within an `extern` block
     pub enum ForeignItem {
@@ -371,22 +355,12 @@
     }
 }
 
-ast_enum! {
-    #[cfg_attr(feature = "clone-impls", derive(Copy))]
-    pub enum ImplPolarity {
-        /// `impl Trait for Type`
-        Positive,
-        /// `impl !Trait for Type`
-        Negative(Token![!]),
-    }
-}
-
 ast_enum_of_structs! {
     pub enum ImplItem {
         pub Const(ImplItemConst {
             pub attrs: Vec<Attribute>,
             pub vis: Visibility,
-            pub defaultness: Defaultness,
+            pub defaultness: Option<Token![default]>,
             pub const_token: Token![const],
             pub ident: Ident,
             pub colon_token: Token![:],
@@ -398,14 +372,14 @@
         pub Method(ImplItemMethod {
             pub attrs: Vec<Attribute>,
             pub vis: Visibility,
-            pub defaultness: Defaultness,
+            pub defaultness: Option<Token![default]>,
             pub sig: MethodSig,
             pub block: Block,
         }),
         pub Type(ImplItemType {
             pub attrs: Vec<Attribute>,
             pub vis: Visibility,
-            pub defaultness: Defaultness,
+            pub defaultness: Option<Token![default]>,
             pub type_token: Token![type],
             pub ident: Ident,
             pub generics: Generics,
@@ -425,7 +399,7 @@
     /// Represents a method's signature in a trait declaration,
     /// or in an implementation.
     pub struct MethodSig {
-        pub constness: Constness,
+        pub constness: Option<Token![const]>,
         pub unsafety: Unsafety,
         pub abi: Option<Abi>,
         pub ident: Ident,
@@ -703,7 +677,7 @@
     impl_synom!(ItemFn "fn item" do_parse!(
         outer_attrs: many0!(Attribute::parse_outer) >>
         vis: syn!(Visibility) >>
-        constness: syn!(Constness) >>
+        constness: option!(keyword!(const)) >>
         unsafety: syn!(Unsafety) >>
         abi: option!(syn!(Abi)) >>
         fn_: keyword!(fn) >>
@@ -1060,7 +1034,7 @@
 
     impl_synom!(TraitItemMethod "method trait item" do_parse!(
         outer_attrs: many0!(Attribute::parse_outer) >>
-        constness: syn!(Constness) >>
+        constness: option!(keyword!(const)) >>
         unsafety: syn!(Unsafety) >>
         abi: option!(syn!(Abi)) >>
         fn_: keyword!(fn) >>
@@ -1153,13 +1127,13 @@
 
     impl_synom!(ItemImpl "impl item" do_parse!(
         attrs: many0!(Attribute::parse_outer) >>
-        defaultness: syn!(Defaultness) >>
+        defaultness: option!(keyword!(default)) >>
         unsafety: syn!(Unsafety) >>
         impl_: keyword!(impl) >>
         generics: syn!(Generics) >>
         polarity_path: alt!(
             do_parse!(
-                polarity: syn!(ImplPolarity) >>
+                polarity: option!(punct!(!)) >>
                 path: syn!(Path) >>
                 for_: keyword!(for) >>
                 (Some((polarity, path, for_)))
@@ -1199,7 +1173,7 @@
     impl_synom!(ImplItemConst "const item in impl block" do_parse!(
         attrs: many0!(Attribute::parse_outer) >>
         vis: syn!(Visibility) >>
-        defaultness: syn!(Defaultness) >>
+        defaultness: option!(keyword!(default)) >>
         const_: keyword!(const) >>
         ident: syn!(Ident) >>
         colon: punct!(:) >>
@@ -1224,8 +1198,8 @@
     impl_synom!(ImplItemMethod "method in impl block" do_parse!(
         outer_attrs: many0!(Attribute::parse_outer) >>
         vis: syn!(Visibility) >>
-        defaultness: syn!(Defaultness) >>
-        constness: syn!(Constness) >>
+        defaultness: option!(keyword!(default)) >>
+        constness: option!(keyword!(const)) >>
         unsafety: syn!(Unsafety) >>
         abi: option!(syn!(Abi)) >>
         fn_: keyword!(fn) >>
@@ -1273,7 +1247,7 @@
     impl_synom!(ImplItemType "type in impl block" do_parse!(
         attrs: many0!(Attribute::parse_outer) >>
         vis: syn!(Visibility) >>
-        defaultness: syn!(Defaultness) >>
+        defaultness: option!(keyword!(default)) >>
         type_: keyword!(type) >>
         ident: syn!(Ident) >>
         generics: syn!(Generics) >>
@@ -1304,30 +1278,6 @@
         })
     ));
 
-    impl Synom for ImplPolarity {
-        named!(parse -> Self, alt!(
-            punct!(!) => { ImplPolarity::Negative }
-            |
-            epsilon!() => { |_| ImplPolarity::Positive }
-        ));
-    }
-
-    impl Synom for Constness {
-        named!(parse -> Self, alt!(
-            keyword!(const) => { Constness::Const }
-            |
-            epsilon!() => { |_| Constness::NotConst }
-        ));
-    }
-
-    impl Synom for Defaultness {
-        named!(parse -> Self, alt!(
-            keyword!(default) => { Defaultness::Default }
-            |
-            epsilon!() => { |_| Defaultness::Final }
-        ));
-    }
-
     fn is_braced(tt: &TokenTree) -> bool {
         match tt.kind {
             TokenNode::Group(Delimiter::Brace, _) => true,
@@ -1799,37 +1749,4 @@
             self.ty.to_tokens(tokens);
         }
     }
-
-    impl ToTokens for Constness {
-        fn to_tokens(&self, tokens: &mut Tokens) {
-            match *self {
-                Constness::Const(ref t) => t.to_tokens(tokens),
-                Constness::NotConst => {
-                    // nothing
-                }
-            }
-        }
-    }
-
-    impl ToTokens for Defaultness {
-        fn to_tokens(&self, tokens: &mut Tokens) {
-            match *self {
-                Defaultness::Default(ref t) => t.to_tokens(tokens),
-                Defaultness::Final => {
-                    // nothing
-                }
-            }
-        }
-    }
-
-    impl ToTokens for ImplPolarity {
-        fn to_tokens(&self, tokens: &mut Tokens) {
-            match *self {
-                ImplPolarity::Negative(ref t) => t.to_tokens(tokens),
-                ImplPolarity::Positive => {
-                    // nothing
-                }
-            }
-        }
-    }
 }
diff --git a/src/lib.rs b/src/lib.rs
index b63974e..38303f9 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -58,9 +58,9 @@
 #[cfg(feature = "full")]
 mod item;
 #[cfg(feature = "full")]
-pub use item::{ArgCaptured, ArgSelf, ArgSelfRef, Constness, Defaultness, FnArg, FnDecl,
+pub use item::{ArgCaptured, ArgSelf, ArgSelfRef, FnArg, FnDecl,
                ForeignItem, ForeignItemFn, ForeignItemStatic, ForeignItemType, ImplItem,
-               ImplItemConst, ImplItemMacro, ImplItemMethod, ImplItemType, ImplPolarity, Item,
+               ImplItemConst, ImplItemMacro, ImplItemMethod, ImplItemType, Item,
                ItemConst, ItemDefaultImpl, ItemEnum, ItemExternCrate, ItemFn, ItemForeignMod,
                ItemImpl, ItemMacro, ItemMacro2, ItemMod, ItemStatic, ItemStruct, ItemTrait,
                ItemType, ItemUnion, ItemUse, MethodSig, TraitItem, TraitItemConst, TraitItemMacro,