diff --git a/Cargo.toml b/Cargo.toml
index b20130b0f49c240350942a5c13e79f5d7b70049f..e375eb08c4f681b7127323817deacb484f8530a2 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -22,6 +22,7 @@ exclude       = [
     "test/**/*"
 ]
 categories = ["network-programming", "data-structures"]
+edition = "2018"
 
 publish = false
 
diff --git a/README.md b/README.md
index 09ebfe9a5c3dc0987c4f784b72ce781af2ae8ecd..1dd8d5d9de35ac194bb22b070ca6b443cf7f3521 100644
--- a/README.md
+++ b/README.md
@@ -19,8 +19,6 @@ bytes = "0.4.12"
 Next, add this to your crate:
 
 ```rust
-extern crate bytes;
-
 use bytes::{Bytes, BytesMut, Buf, BufMut};
 ```
 
diff --git a/benches/buf.rs b/benches/buf.rs
index 99e559bb37ccca4861646659061e7a300c4aca82..0c9a1d955767ff8808a32c07e5f70014e494285a 100644
--- a/benches/buf.rs
+++ b/benches/buf.rs
@@ -1,6 +1,6 @@
 #![feature(test)]
+#![deny(warnings, rust_2018_idioms)]
 
-extern crate bytes;
 extern crate test;
 
 use test::Bencher;
@@ -109,7 +109,7 @@ macro_rules! bench {
             b.iter(|| {
                 for i in 0..8 {
                     bufs[i].reset();
-                    let buf: &mut Buf =  &mut bufs[i]; // type erasure
+                    let buf: &mut dyn Buf =  &mut bufs[i]; // type erasure
                     test::black_box(buf.$method($($arg,)*));
                 }
             })
@@ -123,7 +123,7 @@ macro_rules! bench {
             b.iter(|| {
                 for i in 0..8 {
                     let mut buf = &arr[i..];
-                    let buf = &mut buf as &mut Buf; // type erasure
+                    let buf = &mut buf as &mut dyn Buf; // type erasure
                     test::black_box(buf.$method($($arg,)*));
                 }
             })
@@ -136,7 +136,7 @@ macro_rules! bench {
             b.iter(|| {
                 for _ in 0..8 {
                     let mut buf = Some(data);
-                    let buf = &mut buf as &mut Buf; // type erasure
+                    let buf = &mut buf as &mut dyn Buf; // type erasure
                     test::black_box(buf.get_u8());
                 }
             })
diff --git a/benches/bytes.rs b/benches/bytes.rs
index 7a338746b04c30a616920086c7e53c3e2c6b841c..5885a1bfa23ac59948145f4ffa2fe2c3f349bd36 100644
--- a/benches/bytes.rs
+++ b/benches/bytes.rs
@@ -1,6 +1,6 @@
 #![feature(test)]
+#![deny(warnings, rust_2018_idioms)]
 
-extern crate bytes;
 extern crate test;
 
 use test::Bencher;
@@ -201,7 +201,7 @@ fn slice_empty(b: &mut Bencher) {
     b.iter(|| {
         let b = Bytes::from(vec![17; 1024]).clone();
         for i in 0..1000 {
-            test::black_box(b.slice(i % 100, i % 100));
+            test::black_box(b.slice(i % 100..i % 100));
         }
     })
 }
@@ -212,7 +212,7 @@ fn slice_short_from_arc(b: &mut Bencher) {
         // `clone` is to convert to ARC
         let b = Bytes::from(vec![17; 1024]).clone();
         for i in 0..1000 {
-            test::black_box(b.slice(1, 2 + i % 10));
+            test::black_box(b.slice(1..2 + i % 10));
         }
     })
 }
@@ -231,7 +231,7 @@ fn slice_avg_le_inline_from_arc(b: &mut Bencher) {
         for i in 0..1000 {
             // [1, INLINE_CAP]
             let len = 1 + i % (INLINE_CAP - 1);
-            test::black_box(b.slice(i % 10, i % 10 + len));
+            test::black_box(b.slice(i % 10..i % 10 + len));
         }
     })
 }
@@ -244,7 +244,7 @@ fn slice_large_le_inline_from_arc(b: &mut Bencher) {
         for i in 0..1000 {
             // [INLINE_CAP - 10, INLINE_CAP]
             let len = INLINE_CAP - 9 + i % 10;
-            test::black_box(b.slice(i % 10, i % 10 + len));
+            test::black_box(b.slice(i % 10..i % 10 + len));
         }
     })
 }
diff --git a/src/buf/buf.rs b/src/buf/buf.rs
index bd468d9dda42296d1b496ed0b79027d01794de6f..26ab66160ebffd25755c5b9b871246fcee5cdf41 100644
--- a/src/buf/buf.rs
+++ b/src/buf/buf.rs
@@ -916,7 +916,7 @@ pub trait Buf {
     }
 }
 
-impl<'a, T: Buf + ?Sized> Buf for &'a mut T {
+impl<T: Buf + ?Sized> Buf for &mut T {
     fn remaining(&self) -> usize {
         (**self).remaining()
     }
@@ -952,7 +952,7 @@ impl<T: Buf + ?Sized> Buf for Box<T> {
     }
 }
 
-impl<'a> Buf for &'a [u8] {
+impl Buf for &[u8] {
     #[inline]
     fn remaining(&self) -> usize {
         self.len()
diff --git a/src/buf/buf_mut.rs b/src/buf/buf_mut.rs
index e7935d9f1b32985d1ec07283007a45820603c6c9..235e8f0d1f536f2b2386a9fbe96fe6b1d5f478e4 100644
--- a/src/buf/buf_mut.rs
+++ b/src/buf/buf_mut.rs
@@ -979,7 +979,7 @@ pub trait BufMut {
     }
 }
 
-impl<'a, T: BufMut + ?Sized> BufMut for &'a mut T {
+impl<T: BufMut + ?Sized> BufMut for &mut T {
     fn remaining_mut(&self) -> usize {
         (**self).remaining_mut()
     }
@@ -1015,7 +1015,7 @@ impl<T: BufMut + ?Sized> BufMut for Box<T> {
     }
 }
 
-impl<'a> BufMut for &'a mut [u8] {
+impl BufMut for &mut [u8] {
     #[inline]
     fn remaining_mut(&self) -> usize {
         self.len()
@@ -1029,7 +1029,7 @@ impl<'a> BufMut for &'a mut [u8] {
     #[inline]
     unsafe fn advance_mut(&mut self, cnt: usize) {
         // Lifetime dance taken from `impl Write for &mut [u8]`.
-        let (_, b) = ::std::mem::replace(self, &mut []).split_at_mut(cnt);
+        let (_, b) = std::mem::replace(self, &mut []).split_at_mut(cnt);
         *self = b;
     }
 }
diff --git a/src/buf/chain.rs b/src/buf/chain.rs
index b6f1c767029e60454b3d2d2a41a950b77b8ee0fb..936a086b7555a9b3a924e967502c787702285e36 100644
--- a/src/buf/chain.rs
+++ b/src/buf/chain.rs
@@ -1,5 +1,5 @@
-use {Buf, BufMut};
-use buf::IntoIter;
+use crate::{Buf, BufMut};
+use crate::buf::IntoIter;
 use std::io::{IoSlice, IoSliceMut};
 
 /// A `Chain` sequences two buffers.
diff --git a/src/buf/from_buf.rs b/src/buf/from_buf.rs
index 55f5cef31b9043fd7cea86a32e11c57396b9b47d..db91a95d3111006cb7f584597a5f3b909f3d27d6 100644
--- a/src/buf/from_buf.rs
+++ b/src/buf/from_buf.rs
@@ -1,4 +1,4 @@
-use {Buf, BufMut, IntoBuf, Bytes, BytesMut};
+use crate::{Buf, BufMut, IntoBuf, Bytes, BytesMut};
 
 /// Conversion from a [`Buf`]
 ///
diff --git a/src/buf/into_buf.rs b/src/buf/into_buf.rs
index ea1d36a704d6a7c74332d2c8752cdf573f99f3ab..559021ad3abd3bfba887789010eec8981270f787 100644
--- a/src/buf/into_buf.rs
+++ b/src/buf/into_buf.rs
@@ -1,5 +1,5 @@
 use super::{Buf};
-use ::BytesMut;
+use crate::BytesMut;
 
 /// Conversion into a `Buf`
 ///
diff --git a/src/buf/iter.rs b/src/buf/iter.rs
index a6fe729de309eb1189d5186c518d565a580fa73f..a1bf89b7938562053dac752a94abf5ed95ade1d5 100644
--- a/src/buf/iter.rs
+++ b/src/buf/iter.rs
@@ -1,4 +1,4 @@
-use Buf;
+use crate::Buf;
 
 /// Iterator over the bytes contained by the buffer.
 ///
diff --git a/src/buf/reader.rs b/src/buf/reader.rs
index 15419c02d1e2d0087249a30406b0559d0ac49abd..361fdf7a7ce3afb7c0c1ababa4b505f6f4eab1de 100644
--- a/src/buf/reader.rs
+++ b/src/buf/reader.rs
@@ -1,4 +1,4 @@
-use {Buf};
+use crate::{Buf};
 
 use std::{cmp, io};
 
diff --git a/src/buf/take.rs b/src/buf/take.rs
index 9ab652baa8c794f77c85b7e2ab072f9ef86ad492..559640b10d594cd08fe50dec029f4294a7f7afe0 100644
--- a/src/buf/take.rs
+++ b/src/buf/take.rs
@@ -1,4 +1,4 @@
-use {Buf};
+use crate::Buf;
 
 use std::cmp;
 
diff --git a/src/buf/writer.rs b/src/buf/writer.rs
index a192fe7d7525c008c7a8210780aaa2b3d5c3ba3b..c9462343c8dffb462f14a0a05222990aa8dc91df 100644
--- a/src/buf/writer.rs
+++ b/src/buf/writer.rs
@@ -1,4 +1,4 @@
-use BufMut;
+use crate::BufMut;
 
 use std::{cmp, io};
 
diff --git a/src/bytes.rs b/src/bytes.rs
index 331237182ef55b31c000438898d2076d6da92e3f..9db6362f24fbbc74493a2e0cb516a26aaa98b790 100644
--- a/src/bytes.rs
+++ b/src/bytes.rs
@@ -1,6 +1,6 @@
-use {Buf, BufMut, IntoBuf};
-use buf::IntoIter;
-use debug;
+use crate::{Buf, BufMut, IntoBuf};
+use crate::buf::IntoIter;
+use crate::debug;
 
 use std::{cmp, fmt, mem, hash, slice, ptr, usize};
 use std::borrow::{Borrow, BorrowMut};
@@ -852,7 +852,7 @@ impl Bytes {
     /// assert_eq!(iter.next().map(|b| *b), Some(b'c'));
     /// assert_eq!(iter.next(), None);
     /// ```
-    pub fn iter<'a>(&'a self) -> ::std::slice::Iter<'a, u8> {
+    pub fn iter<'a>(&'a self) -> std::slice::Iter<'a, u8> {
         self.bytes().iter()
     }
 }
@@ -997,7 +997,7 @@ impl Default for Bytes {
 }
 
 impl fmt::Debug for Bytes {
-    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
+    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
         fmt::Debug::fmt(&debug::BsDebug(&self.inner.as_ref()), fmt)
     }
 }
@@ -1026,7 +1026,7 @@ impl IntoIterator for Bytes {
 
 impl<'a> IntoIterator for &'a Bytes {
     type Item = &'a u8;
-    type IntoIter = ::std::slice::Iter<'a, u8>;
+    type IntoIter = std::slice::Iter<'a, u8>;
 
     fn into_iter(self) -> Self::IntoIter {
         self.as_ref().into_iter()
@@ -1534,7 +1534,7 @@ impl BytesMut {
     /// assert_eq!(iter.next().map(|b| *b), Some(b'c'));
     /// assert_eq!(iter.next(), None);
     /// ```
-    pub fn iter<'a>(&'a self) -> ::std::slice::Iter<'a, u8> {
+    pub fn iter<'a>(&'a self) -> std::slice::Iter<'a, u8> {
         self.bytes().iter()
     }
 }
@@ -1725,7 +1725,7 @@ impl Default for BytesMut {
 }
 
 impl fmt::Debug for BytesMut {
-    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
+    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
         fmt::Debug::fmt(&debug::BsDebug(&self.inner.as_ref()), fmt)
     }
 }
@@ -1761,7 +1761,7 @@ impl fmt::Write for BytesMut {
     }
 
     #[inline]
-    fn write_fmt(&mut self, args: fmt::Arguments) -> fmt::Result {
+    fn write_fmt(&mut self, args: fmt::Arguments<'_>) -> fmt::Result {
         fmt::write(self, args)
     }
 }
@@ -1783,7 +1783,7 @@ impl IntoIterator for BytesMut {
 
 impl<'a> IntoIterator for &'a BytesMut {
     type Item = &'a u8;
-    type IntoIter = ::std::slice::Iter<'a, u8>;
+    type IntoIter = std::slice::Iter<'a, u8>;
 
     fn into_iter(self) -> Self::IntoIter {
         self.as_ref().into_iter()
@@ -2818,25 +2818,25 @@ impl<'a, T: ?Sized> PartialOrd<&'a T> for BytesMut
     }
 }
 
-impl<'a> PartialEq<BytesMut> for &'a [u8] {
+impl PartialEq<BytesMut> for &[u8] {
     fn eq(&self, other: &BytesMut) -> bool {
         *other == *self
     }
 }
 
-impl<'a> PartialOrd<BytesMut> for &'a [u8] {
+impl PartialOrd<BytesMut> for &[u8] {
     fn partial_cmp(&self, other: &BytesMut) -> Option<cmp::Ordering> {
         other.partial_cmp(self)
     }
 }
 
-impl<'a> PartialEq<BytesMut> for &'a str {
+impl PartialEq<BytesMut> for &str {
     fn eq(&self, other: &BytesMut) -> bool {
         *other == *self
     }
 }
 
-impl<'a> PartialOrd<BytesMut> for &'a str {
+impl PartialOrd<BytesMut> for &str {
     fn partial_cmp(&self, other: &BytesMut) -> Option<cmp::Ordering> {
         other.partial_cmp(self)
     }
@@ -2938,25 +2938,25 @@ impl PartialOrd<Bytes> for String {
     }
 }
 
-impl<'a> PartialEq<Bytes> for &'a [u8] {
+impl PartialEq<Bytes> for &[u8] {
     fn eq(&self, other: &Bytes) -> bool {
         *other == *self
     }
 }
 
-impl<'a> PartialOrd<Bytes> for &'a [u8] {
+impl PartialOrd<Bytes> for &[u8] {
     fn partial_cmp(&self, other: &Bytes) -> Option<cmp::Ordering> {
         other.partial_cmp(self)
     }
 }
 
-impl<'a> PartialEq<Bytes> for &'a str {
+impl PartialEq<Bytes> for &str {
     fn eq(&self, other: &Bytes) -> bool {
         *other == *self
     }
 }
 
-impl<'a> PartialOrd<Bytes> for &'a str {
+impl PartialOrd<Bytes> for &str {
     fn partial_cmp(&self, other: &Bytes) -> Option<cmp::Ordering> {
         other.partial_cmp(self)
     }
diff --git a/src/debug.rs b/src/debug.rs
index 0677bc3b83589aa9ec3f8a3096880fff90d8a90c..32d88680ca97ab4b7b2563310a993de3740f24e1 100644
--- a/src/debug.rs
+++ b/src/debug.rs
@@ -12,8 +12,8 @@ use std::fmt;
 /// `BsDebug` is not a part of public API of bytes crate.
 pub struct BsDebug<'a>(pub &'a [u8]);
 
-impl<'a> fmt::Debug for BsDebug<'a> {
-    fn fmt(&self, fmt: &mut fmt::Formatter) -> Result<(), fmt::Error> {
+impl fmt::Debug for BsDebug<'_> {
+    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
         write!(fmt, "b\"")?;
         for &c in self.0 {
             // https://doc.rust-lang.org/reference.html#byte-escapes
diff --git a/src/either.rs b/src/either.rs
index dba5d52cd9d511a17ec6ad853634548ad7a8058e..954dfff4b404fc88b4525f436fc4031393957442 100644
--- a/src/either.rs
+++ b/src/either.rs
@@ -1,9 +1,7 @@
-extern crate either;
+use crate::{Buf, BufMut};
 
-use {Buf, BufMut};
-
-use self::either::Either;
-use self::either::Either::*;
+use either::Either;
+use either::Either::*;
 use std::io::{IoSlice, IoSliceMut};
 
 impl<L, R> Buf for Either<L, R>
diff --git a/src/lib.rs b/src/lib.rs
index 9dd149205c07b60dce5e136d6af9781556583a77..031a24cd0aa166dff2fedc508f545a18a2c7d567 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -68,13 +68,11 @@
 //! perform a syscall, which has the potential of failing. Operations on `Buf`
 //! and `BufMut` are infallible.
 
-#![deny(warnings, missing_docs, missing_debug_implementations)]
+#![deny(warnings, missing_docs, missing_debug_implementations, rust_2018_idioms)]
 #![doc(html_root_url = "https://docs.rs/bytes/0.5.0")]
 
-extern crate byteorder;
-
 pub mod buf;
-pub use buf::{
+pub use crate::buf::{
     Buf,
     BufMut,
     IntoBuf,
@@ -82,7 +80,7 @@ pub use buf::{
 
 mod bytes;
 mod debug;
-pub use bytes::{Bytes, BytesMut};
+pub use crate::bytes::{Bytes, BytesMut};
 
 // Optional Serde support
 #[cfg(feature = "serde")]
diff --git a/src/serde.rs b/src/serde.rs
index ff9892196acfa25d8aa01e17cc5fe3794ee6e5ef..7ade4d9d4add3779a7ae462f00b26b88a8696603 100644
--- a/src/serde.rs
+++ b/src/serde.rs
@@ -1,7 +1,5 @@
-extern crate serde;
-
 use std::{cmp, fmt};
-use self::serde::{Serialize, Serializer, Deserialize, Deserializer, de};
+use serde::{Serialize, Serializer, Deserialize, Deserializer, de};
 use super::{Bytes, BytesMut};
 
 macro_rules! serde_impl {
@@ -20,7 +18,7 @@ macro_rules! serde_impl {
         impl<'de> de::Visitor<'de> for $visitor_ty {
             type Value = $ty;
 
-            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
+            fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
                 formatter.write_str("byte array")
             }
 
diff --git a/tests/test_buf.rs b/tests/test_buf.rs
index da0efe72b5ee7e5331e5851ee67e331276ba2f3d..4d60ab5a30fd36a9ca2f8ebd6eebbec2b09e3e95 100644
--- a/tests/test_buf.rs
+++ b/tests/test_buf.rs
@@ -1,5 +1,4 @@
-extern crate bytes;
-extern crate byteorder;
+#![deny(warnings, rust_2018_idioms)]
 
 use bytes::Buf;
 use std::io::IoSlice;
diff --git a/tests/test_buf_mut.rs b/tests/test_buf_mut.rs
index b0af550328a4d942ec638755ce21ad2f65b7d43c..2c9f1f2c497106f7f833ef550fcafa39502709ea 100644
--- a/tests/test_buf_mut.rs
+++ b/tests/test_buf_mut.rs
@@ -1,5 +1,4 @@
-extern crate bytes;
-extern crate byteorder;
+#![deny(warnings, rust_2018_idioms)]
 
 use bytes::{BufMut, BytesMut};
 use std::usize;
diff --git a/tests/test_bytes.rs b/tests/test_bytes.rs
index e4ceb3d3abe35d70b6b3df419a6fa01dacb7b41d..70a8205e0090bc7ae5506cdfb7b456f6766f0aa1 100644
--- a/tests/test_bytes.rs
+++ b/tests/test_bytes.rs
@@ -1,4 +1,4 @@
-extern crate bytes;
+#![deny(warnings, rust_2018_idioms)]
 
 use bytes::{Bytes, BytesMut, Buf, BufMut};
 
diff --git a/tests/test_chain.rs b/tests/test_chain.rs
index 582c65716eba2cb3c05e5957a7592b78ea6f6d2b..6708028fb3e456d5f9f4c48b352be0d9e02a9848 100644
--- a/tests/test_chain.rs
+++ b/tests/test_chain.rs
@@ -1,4 +1,4 @@
-extern crate bytes;
+#![deny(warnings, rust_2018_idioms)]
 
 use bytes::{Buf, BufMut, Bytes, BytesMut};
 use bytes::buf::Chain;
diff --git a/tests/test_debug.rs b/tests/test_debug.rs
index 9945a2835bb1a1eeffca155ed0aa4b4da277f883..7528bac87b0282c68db954268244f8522221f586 100644
--- a/tests/test_debug.rs
+++ b/tests/test_debug.rs
@@ -1,4 +1,4 @@
-extern crate bytes;
+#![deny(warnings, rust_2018_idioms)]
 
 use bytes::Bytes;
 
diff --git a/tests/test_from_buf.rs b/tests/test_from_buf.rs
index efa043c02e3504cf5de7911cd7efb94ed00d26d0..5f644e1329ddcefb98f78717587e7d7af057ed84 100644
--- a/tests/test_from_buf.rs
+++ b/tests/test_from_buf.rs
@@ -1,4 +1,4 @@
-extern crate bytes;
+#![deny(warnings, rust_2018_idioms)]
 
 use bytes::{Buf, Bytes, BytesMut};
 
diff --git a/tests/test_iter.rs b/tests/test_iter.rs
index 2d2f4951ae8bad49426e134812a2e0b21ab89bfa..13b86cdad4546d5485c986ed7812723a0a7d3263 100644
--- a/tests/test_iter.rs
+++ b/tests/test_iter.rs
@@ -1,6 +1,6 @@
-extern crate bytes;
+#![deny(warnings, rust_2018_idioms)]
 
-use bytes::{Bytes};
+use bytes::Bytes;
 
 #[test]
 fn iter_len() {
diff --git a/tests/test_reader.rs b/tests/test_reader.rs
index a10d70be0c356cd71d52fe033328e64359dfe6a1..89a78497a7d86fa92aaac7c052bef049b4602b7b 100644
--- a/tests/test_reader.rs
+++ b/tests/test_reader.rs
@@ -1,4 +1,4 @@
-extern crate bytes;
+#![deny(warnings, rust_2018_idioms)]
 
 use std::io::{BufRead, Read};
 
diff --git a/tests/test_serde.rs b/tests/test_serde.rs
index ff440242f454689fa920c6f804d585f27025e9e7..18b135692bcdd973b664cd79be13f0818cd9a436 100644
--- a/tests/test_serde.rs
+++ b/tests/test_serde.rs
@@ -1,7 +1,6 @@
 #![cfg(feature = "serde")]
+#![deny(warnings, rust_2018_idioms)]
 
-extern crate bytes;
-extern crate serde_test;
 use serde_test::{Token, assert_tokens};
 
 #[test]
diff --git a/tests/test_take.rs b/tests/test_take.rs
index ebc91dd06bf2cf83ffdbd86c8642a87f731ad7c5..7d043183f7f3b6bbf8f45d280d7751f64e9e8143 100644
--- a/tests/test_take.rs
+++ b/tests/test_take.rs
@@ -1,4 +1,4 @@
-extern crate bytes;
+#![deny(warnings, rust_2018_idioms)]
 
 use bytes::Buf;