diff --git a/src/byte_str.rs b/src/byte_str.rs
index 5619d0808c2ea10c74c3e1ef8b68a1fb97dcb7a2..d701aa414f6fc1f5152e6d7c0d8eb4155304475f 100644
--- a/src/byte_str.rs
+++ b/src/byte_str.rs
@@ -86,12 +86,12 @@ impl ToBytes for SeqByteStr {
 impl ops::Index<usize> for SeqByteStr {
     type Output = u8;
 
-    fn index(&self, index: &usize) -> &u8 {
-        assert!(*index < self.len());
+    fn index(&self, index: usize) -> &u8 {
+        assert!(index < self.len());
 
         unsafe {
             &*self.mem.ptr()
-                .offset(*index as isize + self.pos as isize)
+                .offset(index as isize + self.pos as isize)
         }
     }
 }
@@ -187,9 +187,9 @@ impl ToBytes for SmallByteStr {
 impl ops::Index<usize> for SmallByteStr {
     type Output = u8;
 
-    fn index(&self, index: &usize) -> &u8 {
-        assert!(*index < self.len());
-        &self.bytes[*index]
+    fn index(&self, index: usize) -> &u8 {
+        assert!(index < self.len());
+        &self.bytes[index]
     }
 }
 
diff --git a/src/bytes.rs b/src/bytes.rs
index 149a4d85c1e800e48276cabf1eb84b790278af61..c426f81969b2900dfea3bdb6864936e8350b6412 100644
--- a/src/bytes.rs
+++ b/src/bytes.rs
@@ -163,7 +163,7 @@ impl ToBytes for Bytes {
 impl ops::Index<usize> for Bytes {
     type Output = u8;
 
-    fn index(&self, index: &usize) -> &u8 {
+    fn index(&self, index: usize) -> &u8 {
         self.obj().index(index)
     }
 }
@@ -212,7 +212,7 @@ trait ByteStrPriv {
 
     fn get_type_id(&self) -> TypeId;
 
-    fn index(&self, index: &usize) -> &u8;
+    fn index(&self, index: usize) -> &u8;
 
     fn len(&self) -> usize;
 
@@ -245,7 +245,7 @@ impl<B: ByteStr + 'static> ByteStrPriv for B {
         Any::get_type_id(self)
     }
 
-    fn index(&self, index: &usize) -> &u8 {
+    fn index(&self, index: usize) -> &u8 {
         ops::Index::index(self, index)
     }
 
diff --git a/src/lib.rs b/src/lib.rs
index 5f1909e4f6166f6f3ece40a428438944f9500018..ca7c391f49d48f4eed03863acf55bf54a1e90495 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1,7 +1,7 @@
 #![crate_name = "bytes"]
 #![unstable]
 
-#![feature(alloc, core, unsafe_no_drop_flag)]
+#![feature(alloc, convert, core, unsafe_no_drop_flag)]
 
 pub use byte_buf::{ByteBuf, ROByteBuf, MutByteBuf};
 pub use byte_str::{SeqByteStr, SmallByteStr, SmallByteStrBuf};
@@ -314,7 +314,7 @@ impl<'a> ToBytes for &'a [u8] {
 
 impl<'a> ToBytes for &'a Vec<u8> {
     fn to_bytes(self) -> Bytes {
-        self.as_slice().to_bytes()
+        (&self[..]).to_bytes()
     }
 }
 
@@ -407,7 +407,7 @@ impl<'a> Source for &'a Vec<u8> {
     type Error = BufError;
 
     fn fill<B: MutBuf>(self, buf: &mut B) -> Result<usize, BufError> {
-        Ok(buf.write_slice(self.as_slice()))
+        Ok(buf.write_slice(self.as_ref()))
     }
 }
 
diff --git a/src/rope.rs b/src/rope.rs
index 180859e94358b91805246b26e8eba2c8bf4fc8bf..ca724df805fa4530110961d61af5ea799fa6ec44 100644
--- a/src/rope.rs
+++ b/src/rope.rs
@@ -157,15 +157,15 @@ impl ToBytes for Rope {
 impl ops::Index<usize> for Rope {
     type Output = u8;
 
-    fn index(&self, index: &usize) -> &u8 {
-        assert!(*index < self.len());
+    fn index(&self, index: usize) -> &u8 {
+        assert!(index < self.len());
 
         let left_len = self.inner.left.len();
 
-        if *index < left_len {
+        if index < left_len {
             self.inner.left.index(index)
         } else {
-            self.inner.right.index(&(*index - left_len))
+            self.inner.right.index(index - left_len)
         }
     }
 }
@@ -556,7 +556,7 @@ impl Balance {
     }
 
     fn peek(&self) -> Option<&Bytes> {
-        self.stack.as_slice().last()
+        self.stack.last()
     }
 }
 
diff --git a/test/test_byte_buf.rs b/test/test_byte_buf.rs
index 3cbe009e1239d96e875a5868d82bfd19a939aa6b..1c3fd24722134c0c9ea8f484e196485d5f945c55 100644
--- a/test/test_byte_buf.rs
+++ b/test/test_byte_buf.rs
@@ -21,26 +21,26 @@ pub fn test_initial_buf_empty() {
 pub fn test_byte_buf_read_write() {
     let mut buf = ByteBuf::mut_with_capacity(32);
 
-    buf.write(b"hello world".as_slice()).unwrap();
+    buf.write(&b"hello world"[..]).unwrap();
     assert_eq!(21, buf.remaining());
 
-    buf.write(b" goodbye".as_slice()).unwrap();
+    buf.write(&b" goodbye"[..]).unwrap();
     assert_eq!(13, buf.remaining());
 
     let mut buf = buf.flip();
     let mut dst = [0; 5];
 
-    assert_eq!(5, buf.read(dst.as_mut_slice()).unwrap());
+    assert_eq!(5, buf.read(&mut dst[..]).unwrap());
     assert_eq!(b"hello", &dst);
 
-    assert_eq!(5, buf.read(dst.as_mut_slice()).unwrap());
+    assert_eq!(5, buf.read(&mut dst[..]).unwrap());
     assert_eq!(b" worl", &dst);
 
     let mut dst = [0; 2];
-    assert_eq!(2, buf.read(dst.as_mut_slice()).unwrap());
+    assert_eq!(2, buf.read(&mut dst[..]).unwrap());
     assert_eq!(b"d ", &dst);
 
     let mut dst = [0; 7];
-    assert_eq!(7, buf.read(dst.as_mut_slice()).unwrap());
+    assert_eq!(7, buf.read(&mut dst[..]).unwrap());
     assert_eq!(b"goodbye", &dst);
 }
diff --git a/test/test_bytes.rs b/test/test_bytes.rs
index cb7873b49babb389fd8df1c6b8bf94f88e601a19..ae5f6f86409b0ca17f4b9d9b9aced9843c9ee3d7 100644
--- a/test/test_bytes.rs
+++ b/test/test_bytes.rs
@@ -5,7 +5,7 @@ pub fn test_debug_short_str_valid_ascii() {
     let b = Bytes::from_slice(b"abcdefghij234");
     let d = format!("{:?}", b);
 
-    assert_eq!(d.as_slice(), "Bytes[len=13; abcdefghij234]");
+    assert_eq!(d, "Bytes[len=13; abcdefghij234]");
 }
 
 #[test]
@@ -25,10 +25,10 @@ pub fn test_debug_long_str_valid_ascii() {
 
     let d = format!("{:?}", b);
 
-    assert_eq!(d.as_slice(), "Bytes[len=556; Lorem ipsum dolor sit amet, \
-                              consectetur adipiscing elit. Duis volutpat \
-                              eros in gravida malesuada. Phasellus \
-                              lobortis maximus cur ... ]");
+    assert_eq!(d, "Bytes[len=556; Lorem ipsum dolor sit amet, \
+                   consectetur adipiscing elit. Duis volutpat \
+                   eros in gravida malesuada. Phasellus \
+                   lobortis maximus cur ... ]");
 }
 
 #[test]
@@ -38,5 +38,5 @@ pub fn test_short_string_invalid_ascii() {
 
     println!("{:?}", b);
 
-    assert_eq!(d.as_slice(), "Bytes[len=11; foo\\x00bar\\xFFbaz]");
+    assert_eq!(d, "Bytes[len=11; foo\\x00bar\\xFFbaz]");
 }
diff --git a/test/test_rope.rs b/test/test_rope.rs
index 27070cf807ba89e6235f19ff446da29c444b8498..1f30f10672b8cf42fc758b648d9f85e3c58c14d1 100644
--- a/test/test_rope.rs
+++ b/test/test_rope.rs
@@ -36,7 +36,7 @@ pub fn test_rope_round_trip() {
     let mut dst = vec![];
     rope.buf().read(&mut dst).unwrap();
 
-    assert_eq!(b"zomg", dst.as_slice());
+    assert_eq!(b"zomg", dst);
 }
 
 #[test]
@@ -47,19 +47,19 @@ pub fn test_rope_slice() {
     assert_eq!(TEST_BYTES_1.len(), bytes.len());
 
     bytes.buf().read(&mut dst).unwrap();
-    assert_eq!(dst.as_slice(), TEST_BYTES_1);
+    assert_eq!(dst, TEST_BYTES_1);
 
     let left = bytes.slice_to(250);
     assert_eq!(250, left.len());
 
     left.buf().read(&mut dst).unwrap();
-    assert_eq!(dst.as_slice(), &TEST_BYTES_1[..250]);
+    assert_eq!(dst, &TEST_BYTES_1[..250]);
 
     let right = bytes.slice_from(250);
     assert_eq!(TEST_BYTES_1.len() - 250, right.len());
 
     right.buf().read(&mut dst).unwrap();
-    assert_eq!(dst.as_slice(), &TEST_BYTES_1[250..]);
+    assert_eq!(dst, &TEST_BYTES_1[250..]);
 }
 
 #[test]
@@ -74,7 +74,7 @@ pub fn test_rope_concat_two_byte_str() {
     assert_eq!(both.len(), TEST_BYTES_1.len() + TEST_BYTES_2.len());
 
     both.buf().read(&mut dst).unwrap();
-    assert_eq!(dst.as_slice(), TEST_BYTES_1.to_vec() + TEST_BYTES_2);
+    assert_eq!(dst, TEST_BYTES_1.to_vec() + TEST_BYTES_2);
 }
 
 #[test]
@@ -84,7 +84,7 @@ pub fn test_slice_parity() {
     let start = 512 * 1024 - 3333;
     let end = 512 * 1024 + 7777;
 
-    let _ = Rope::from_slice(bytes.as_slice()).slice(start, end);
+    let _ = Rope::from_slice(&bytes).slice(start, end);
 
     // stuff
 }
diff --git a/test/test_seq_byte_str.rs b/test/test_seq_byte_str.rs
index d552a03a7bd992115f3e8ac7ea2c5a8350a2ee4a..23e959afcf002935047acfae3ad0ca6bf97b71f2 100644
--- a/test/test_seq_byte_str.rs
+++ b/test/test_seq_byte_str.rs
@@ -7,7 +7,7 @@ pub fn test_slice_round_trip() {
     let mut dst = vec![];
     let src = gen_bytes(2000);
 
-    let s = SeqByteStr::from_slice(src.as_slice());
+    let s = SeqByteStr::from_slice(&src);
     assert_eq!(2000, s.len());
 
     s.buf().read(&mut dst).unwrap();
@@ -18,7 +18,7 @@ pub fn test_slice_round_trip() {
 pub fn test_index() {
     let src = gen_bytes(2000);
 
-    let s = SeqByteStr::from_slice(src.as_slice());
+    let s = SeqByteStr::from_slice(&src);
 
     for i in 0..2000 {
         assert_eq!(src[i], s[i]);
@@ -28,6 +28,6 @@ pub fn test_index() {
 #[test]
 #[should_panic]
 pub fn test_index_out_of_range() {
-    let s = SeqByteStr::from_slice(gen_bytes(2000).as_slice());
+    let s = SeqByteStr::from_slice(&gen_bytes(2000));
     let _ = s[2001];
 }
diff --git a/test/test_small_byte_str.rs b/test/test_small_byte_str.rs
index 2efc95d5f3e7707b4a64d3ccf191613795fb5aca..938b73223fd564483f1b7e8eff5e870881b23191 100644
--- a/test/test_small_byte_str.rs
+++ b/test/test_small_byte_str.rs
@@ -7,7 +7,7 @@ pub fn test_slice_round_trip() {
     let mut dst = vec![];
     let src = gen_bytes(3);
 
-    let s = SmallByteStr::from_slice(src.as_slice()).unwrap();
+    let s = SmallByteStr::from_slice(&src).unwrap();
     assert_eq!(3, s.len());
 
     s.buf().read(&mut dst).unwrap();
@@ -18,7 +18,7 @@ pub fn test_slice_round_trip() {
 pub fn test_index() {
     let src = gen_bytes(3);
 
-    let s = SmallByteStr::from_slice(src.as_slice()).unwrap();
+    let s = SmallByteStr::from_slice(&src).unwrap();
 
     for i in 0..3 {
         assert_eq!(src[i], s[i]);
@@ -28,6 +28,6 @@ pub fn test_index() {
 #[test]
 #[should_panic]
 pub fn test_index_out_of_range() {
-    let s = SmallByteStr::from_slice(gen_bytes(3).as_slice()).unwrap();
+    let s = SmallByteStr::from_slice(&gen_bytes(3)).unwrap();
     let _ = s[2001];
 }