Function to peek any ident
diff --git a/src/ext.rs b/src/ext.rs
index 8d679e7..91eec34 100644
--- a/src/ext.rs
+++ b/src/ext.rs
@@ -4,7 +4,10 @@
 
 use proc_macro2::Ident;
 
-use parse::{ParseStream, Result};
+use buffer::Cursor;
+use parse::{ParseStream, Peek, Result};
+use sealed::lookahead;
+use token::CustomToken;
 
 /// Additional methods for `Ident` not provided by proc-macro2 or libproc_macro.
 ///
@@ -15,7 +18,7 @@
 pub trait IdentExt: Sized + private::Sealed {
     /// Parses any identifier including keywords.
     ///
-    /// This is useful when parsing a DSL which allows Rust keywords as
+    /// This is useful when parsing macro input which allows Rust keywords as
     /// identifiers.
     ///
     /// # Example
@@ -25,6 +28,10 @@
     /// use syn::ext::IdentExt;
     /// use syn::parse::ParseStream;
     ///
+    /// mod kw {
+    ///     syn::custom_keyword!(name);
+    /// }
+    ///
     /// // Parses input that looks like `name = NAME` where `NAME` can be
     /// // any identifier.
     /// //
@@ -33,10 +40,7 @@
     /// //     name = anything
     /// //     name = impl
     /// fn parse_dsl(input: ParseStream) -> Result<Ident> {
-    ///     let name_token: Ident = input.parse()?;
-    ///     if name_token != "name" {
-    ///         return Err(Error::new(name_token.span(), "expected `name`"));
-    ///     }
+    ///     input.parse::<kw::name>()?;
     ///     input.parse::<Token![=]>()?;
     ///     let name = input.call(Ident::parse_any)?;
     ///     Ok(name)
@@ -44,6 +48,14 @@
     /// ```
     fn parse_any(input: ParseStream) -> Result<Self>;
 
+    /// Peeks any identifier including keywords. Usage:
+    /// `input.peek(Ident::peek_any)`
+    ///
+    /// This is different from `input.peek(Ident)` which only returns true in
+    /// the case of an ident which is not a Rust keyword.
+    #[allow(non_upper_case_globals)]
+    const peek_any: private::PeekFn = private::PeekFn;
+
     /// Strips the raw marker `r#`, if any, from the beginning of an ident.
     ///
     ///   - unraw(`x`) = `x`
@@ -92,10 +104,30 @@
     }
 }
 
+impl Peek for private::PeekFn {
+    type Token = private::IdentAny;
+}
+
+impl CustomToken for private::IdentAny {
+    fn peek(cursor: Cursor) -> bool {
+        cursor.ident().is_some()
+    }
+
+    fn display() -> &'static str {
+        "identifier"
+    }
+}
+
+impl lookahead::Sealed for private::PeekFn {}
+
 mod private {
     use proc_macro2::Ident;
 
     pub trait Sealed {}
 
     impl Sealed for Ident {}
+
+    #[derive(Copy, Clone)]
+    pub struct PeekFn;
+    pub struct IdentAny;
 }
diff --git a/src/lib.rs b/src/lib.rs
index 85f44b2..dce314f 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -540,6 +540,7 @@
 
 mod custom_keyword;
 mod custom_punctuation;
+mod sealed;
 
 #[cfg(feature = "parsing")]
 mod lookahead;
diff --git a/src/lookahead.rs b/src/lookahead.rs
index 8ee1554..0f5afe1 100644
--- a/src/lookahead.rs
+++ b/src/lookahead.rs
@@ -4,6 +4,7 @@
 
 use buffer::Cursor;
 use error::{self, Error};
+use sealed::lookahead::Sealed;
 use span::IntoSpans;
 use token::Token;
 
@@ -94,7 +95,8 @@
     ///
     /// - `input.peek(Token![struct])`
     /// - `input.peek(Token![==])`
-    /// - `input.peek(Ident)`
+    /// - `input.peek(Ident)`&emsp;*(does not accept keywords)*
+    /// - `input.peek(Ident::peek_any)`
     /// - `input.peek(Lifetime)`
     /// - `input.peek(token::Brace)`
     pub fn peek<T: Peek>(&self, token: T) -> bool {
@@ -141,7 +143,7 @@
 /// This trait is sealed and cannot be implemented for types outside of Syn.
 ///
 /// [`ParseStream::peek`]: struct.ParseBuffer.html#method.peek
-pub trait Peek: private::Sealed {
+pub trait Peek: Sealed {
     // Not public API.
     #[doc(hidden)]
     type Token: Token;
@@ -163,8 +165,4 @@
     cursor.group(delimiter).is_some()
 }
 
-mod private {
-    use super::{Token, TokenMarker};
-    pub trait Sealed: Copy {}
-    impl<F: Copy + FnOnce(TokenMarker) -> T, T: Token> Sealed for F {}
-}
+impl<F: Copy + FnOnce(TokenMarker) -> T, T: Token> Sealed for F {}
diff --git a/src/parse.rs b/src/parse.rs
index 36f1caf..e651d15 100644
--- a/src/parse.rs
+++ b/src/parse.rs
@@ -469,7 +469,8 @@
     ///
     /// - `input.peek(Token![struct])`
     /// - `input.peek(Token![==])`
-    /// - `input.peek(Ident)`
+    /// - `input.peek(Ident)`&emsp;*(does not accept keywords)*
+    /// - `input.peek(Ident::peek_any)`
     /// - `input.peek(Lifetime)`
     /// - `input.peek(token::Brace)`
     ///
diff --git a/src/sealed.rs b/src/sealed.rs
new file mode 100644
index 0000000..0b11bc9
--- /dev/null
+++ b/src/sealed.rs
@@ -0,0 +1,4 @@
+#[cfg(feature = "parsing")]
+pub mod lookahead {
+    pub trait Sealed: Copy {}
+}