diff --git a/src/legacy.rs b/src/legacy.rs
index 96ab482..33803cd 100644
--- a/src/legacy.rs
+++ b/src/legacy.rs
@@ -162,7 +162,7 @@
                             if escape.starts_with('u') {
                                 let digits = &escape[1..];
                                 let all_lower_hex = digits.chars().all(|c| match c {
-                                    '0'...'9' | 'a'...'f' => true,
+                                    '0'..='9' | 'a'..='f' => true,
                                     _ => false,
                                 });
                                 let c = u32::from_str_radix(digits, 16)
diff --git a/src/lib.rs b/src/lib.rs
index 1473c9b..176cb71 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -70,7 +70,7 @@
     if let Some(i) = s.find(llvm) {
         let candidate = &s[i + llvm.len()..];
         let all_hex = candidate.chars().all(|c| match c {
-            'A'...'F' | '0'...'9' | '@' => true,
+            'A'..='F' | '0'..='9' | '@' => true,
             _ => false,
         });
 
@@ -160,7 +160,7 @@
 // Copied from the documentation of `char::is_ascii_alphanumeric`
 fn is_ascii_alphanumeric(c: char) -> bool {
     match c {
-        '\u{0041}'...'\u{005A}' | '\u{0061}'...'\u{007A}' | '\u{0030}'...'\u{0039}' => true,
+        '\u{0041}'..='\u{005A}' | '\u{0061}'..='\u{007A}' | '\u{0030}'..='\u{0039}' => true,
         _ => false,
     }
 }
@@ -168,10 +168,10 @@
 // Copied from the documentation of `char::is_ascii_punctuation`
 fn is_ascii_punctuation(c: char) -> bool {
     match c {
-        '\u{0021}'...'\u{002F}'
-        | '\u{003A}'...'\u{0040}'
-        | '\u{005B}'...'\u{0060}'
-        | '\u{007B}'...'\u{007E}' => true,
+        '\u{0021}'..='\u{002F}'
+        | '\u{003A}'..='\u{0040}'
+        | '\u{005B}'..='\u{0060}'
+        | '\u{007B}'..='\u{007E}' => true,
         _ => false,
     }
 }
diff --git a/src/v0.rs b/src/v0.rs
index 8afaca1..96ed69d 100644
--- a/src/v0.rs
+++ b/src/v0.rs
@@ -32,7 +32,7 @@
 
     // Paths always start with uppercase characters.
     match inner.as_bytes()[0] {
-        b'A'...b'Z' => {}
+        b'A'..=b'Z' => {}
         _ => return Err(Invalid),
     }
 
@@ -50,7 +50,7 @@
 
     // Instantiating crate (paths always start with uppercase characters).
     match parser.sym.as_bytes().get(parser.next) {
-        Some(&b'A'...b'Z') => {
+        Some(&(b'A'..=b'Z')) => {
             try!(parser.skip_path());
         }
         _ => {}
@@ -159,8 +159,8 @@
                 let t = min(max(k.saturating_sub(bias), t_min), t_max);
 
                 let d = match punycode_bytes.next() {
-                    Some(d @ b'a'...b'z') => d - b'a',
-                    Some(d @ b'0'...b'9') => 26 + (d - b'0'),
+                    Some(d @ b'a'..=b'z') => d - b'a',
+                    Some(d @ b'0'..=b'9') => 26 + (d - b'0'),
                     _ => return Err(()),
                 };
                 let d = d as usize;
@@ -295,7 +295,7 @@
         let start = self.next;
         loop {
             match try!(self.next()) {
-                b'0'...b'9' | b'a'...b'f' => {}
+                b'0'..=b'9' | b'a'..=b'f' => {}
                 b'_' => break,
                 _ => return Err(Invalid),
             }
@@ -305,7 +305,7 @@
 
     fn digit_10(&mut self) -> Result<u8, Invalid> {
         let d = match self.peek() {
-            Some(d @ b'0'...b'9') => d - b'0',
+            Some(d @ b'0'..=b'9') => d - b'0',
             _ => return Err(Invalid),
         };
         self.next += 1;
@@ -314,9 +314,9 @@
 
     fn digit_62(&mut self) -> Result<u8, Invalid> {
         let d = match self.peek() {
-            Some(d @ b'0'...b'9') => d - b'0',
-            Some(d @ b'a'...b'z') => 10 + (d - b'a'),
-            Some(d @ b'A'...b'Z') => 10 + 26 + (d - b'A'),
+            Some(d @ b'0'..=b'9') => d - b'0',
+            Some(d @ b'a'..=b'z') => 10 + (d - b'a'),
+            Some(d @ b'A'..=b'Z') => 10 + 26 + (d - b'A'),
             _ => return Err(Invalid),
         };
         self.next += 1;
@@ -351,10 +351,10 @@
     fn namespace(&mut self) -> Result<Option<char>, Invalid> {
         match try!(self.next()) {
             // Special namespaces, like closures and shims.
-            ns @ b'A'...b'Z' => Ok(Some(ns as char)),
+            ns @ b'A'..=b'Z' => Ok(Some(ns as char)),
 
             // Implementation-specific/unspecified namespaces.
-            b'a'...b'z' => Ok(None),
+            b'a'..=b'z' => Ok(None),
 
             _ => Err(Invalid),
         }
