Minor API tweaks
diff --git a/src/lib.rs b/src/lib.rs
index c28e09a..541e070 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -5,7 +5,6 @@
 extern crate synom;
 
 use std::fmt;
-use std::ops;
 use std::str::FromStr;
 use std::iter::FromIterator;
 
@@ -140,10 +139,8 @@
     }
 }
 
-impl ops::Deref for Symbol {
-    type Target = str;
-
-    fn deref(&self) -> &str {
+impl Symbol {
+    fn as_str(&self) -> &str {
         &self.0
     }
 }
@@ -164,20 +161,28 @@
 }
 
 impl Literal {
-    pub fn bytechar(b: u8) -> Literal {
-        Literal(imp::Literal::bytechar(b))
+    pub fn byte_char(b: u8) -> Literal {
+        Literal(imp::Literal::byte_char(b))
     }
 
-    pub fn bytestring(s: &[u8]) -> Literal {
-        Literal(imp::Literal::bytestring(s))
+    pub fn byte_string(s: &[u8]) -> Literal {
+        Literal(imp::Literal::byte_string(s))
     }
 
     pub fn doccomment(s: &str) -> Literal {
         Literal(imp::Literal::doccomment(s))
     }
+
+    pub fn float(s: &str) -> Literal {
+        Literal(imp::Literal::float(s))
+    }
+
+    pub fn integer(s: &str) -> Literal {
+        Literal(imp::Literal::integer(s))
+    }
 }
 
-macro_rules! tys {
+macro_rules! froms {
     ($($t:ty,)*) => {$(
         impl<'a> From<$t> for Literal {
             fn from(t: $t) -> Literal {
@@ -187,7 +192,7 @@
     )*}
 }
 
-tys! {
+froms! {
     u8, u16, u32, u64, usize,
     i8, i16, i32, i64, isize,
     f32, f64, char, &'a str,
diff --git a/src/stable.rs b/src/stable.rs
index ebff2e9..3c93888 100644
--- a/src/stable.rs
+++ b/src/stable.rs
@@ -75,7 +75,7 @@
                         write!(f, "{} {} {}", start, stream, end)?
                     }
                 }
-                TokenKind::Word(ref sym) => write!(f, "{}", &**sym)?,
+                TokenKind::Word(ref sym) => write!(f, "{}", sym.as_str())?,
                 TokenKind::Op(ch, ref op) => {
                     write!(f, "{}", ch)?;
                     match *op {
@@ -214,7 +214,7 @@
 pub struct Literal(String);
 
 impl Literal {
-    pub fn bytechar(byte: u8) -> Literal {
+    pub fn byte_char(byte: u8) -> Literal {
         match byte {
             0 => Literal(format!("b'\\0'")),
             b'\"' => Literal(format!("b'\"'")),
@@ -227,7 +227,7 @@
         }
     }
 
-    pub fn bytestring(bytes: &[u8]) -> Literal {
+    pub fn byte_string(bytes: &[u8]) -> Literal {
         let mut escaped = "b\"".to_string();
         for b in bytes {
             match *b {
@@ -248,6 +248,14 @@
     pub fn doccomment(s: &str) -> Literal {
         Literal(s.to_string())
     }
+
+    pub fn float(s: &str) -> Literal {
+        Literal(s.to_string())
+    }
+
+    pub fn integer(s: &str) -> Literal {
+        Literal(s.to_string())
+    }
 }
 
 impl fmt::Display for Literal {
@@ -256,7 +264,7 @@
     }
 }
 
-macro_rules! numbers {
+macro_rules! ints {
     ($($t:ty,)*) => {$(
         impl From<$t> for Literal {
             fn from(t: $t) -> Literal {
@@ -266,9 +274,24 @@
     )*}
 }
 
-numbers! {
+ints! {
     u8, u16, u32, u64, usize,
     i8, i16, i32, i64, isize,
+}
+
+macro_rules! floats {
+    ($($t:ty,)*) => {$(
+        impl From<$t> for Literal {
+            fn from(t: $t) -> Literal {
+                assert!(!t.is_nan());
+                assert!(!t.is_infinite());
+                Literal(format!(concat!("{}", stringify!($t)), t))
+            }
+        }
+    )*}
+}
+
+floats! {
     f32, f64,
 }