diff --git a/README.md b/README.md
index 7ba7be9..e35f373 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,72 @@
 cast
 ====
 
-easy casting from one type to another in Go 
+Easy and safe casting from one type to another in Go
+
+Don’t Panic! ... Cast
+
+## What is Cast?
+
+Cast is a library to convert between different go types in a consistent and easy way.
+
+Cast provides simple functions to easily convert a number to a string, an
+interface into a bool, etc. Cast does this intelligently when an obvious
+conversion is possible. It doesn’t make any attempts to guess what you meant,
+for example you can only convert a string to an int when it is a string
+representation of an int such as “8”. Cast was developed for use in
+[Hugo](http://hugo.spf13.com), a website engine which uses YAML, TOML or JSON
+for meta data.
+
+## Why use Cast?
+
+When working with dynamic data in Go you often need to cast or convert the data
+from one type into another. Cast goes beyond just using type assertion (though
+it uses that when possible) to provide a very straightforward and convenient
+library.
+
+If you are working with interfaces to handle things like dynamic content
+you’ll need an easy way to convert an interface into a given type. This
+is the library for you.
+
+If you are taking in data from YAML, TOML or JSON or other formats which lack
+full types, then Cast is the library for you.
+
+## Usage
+
+Cast provides a handful of To_____ methods. These methods will always return
+the desired type. **If input is provided that will not convert to that type, the
+0 or nil value for that type will be returned**.
+
+Cast also provides identical methods To_____E. These return the same result as
+the To_____ methods, plus an additional bool which tells you if it successfully
+converted. Using these methods you can tell the difference between when the
+input matched the zero value or when the conversion failed and the zero value
+was returned.
+
+The following examples are merely a sample of what is available. Please review
+the code for a complete set.
+
+### Example ‘ToString’:
+
+    cast.ToString("mayonegg")         // "mayonegg"
+    cast.ToString(8)                  // "8"
+    cast.ToString(8.31)               // "8.31"
+    cast.ToString([]byte("one time")) // "one time"
+    cast.ToString(nil)                // ""
+
+	var foo interface{} = "one more time"
+    cast.ToString(foo)                // "one more time"
+
+
+### Example ‘ToInt’:
+
+    cast.ToInt(8)                  // 8
+    cast.ToInt(8.31)               // 8
+    cast.ToInt("8")                // 8
+    cast.ToInt(true)               // 1
+    cast.ToInt(false)              // 0
+
+	var eight interface{} = 8
+    cast.ToInt(eight)              // 8
+    cast.ToInt(nil)                // 0
+
diff --git a/cast_test.go b/cast_test.go
index 5a6dc3d..c9f642c 100644
--- a/cast_test.go
+++ b/cast_test.go
@@ -14,12 +14,22 @@
 func TestToInt(t *testing.T) {
 	var eight interface{} = 8
 	assert.Equal(t, ToInt(8), 8)
+	assert.Equal(t, ToInt(8.31), 8)
 	assert.Equal(t, ToInt("8"), 8)
 	assert.Equal(t, ToInt(true), 1)
 	assert.Equal(t, ToInt(false), 0)
 	assert.Equal(t, ToInt(eight), 8)
 }
 
+func TestToString(t *testing.T) {
+	var foo interface{} = "one more time"
+	assert.Equal(t, ToString(8), "8")
+	assert.Equal(t, ToString(8.12), "8.12")
+	assert.Equal(t, ToString([]byte("one time")), "one time")
+	assert.Equal(t, ToString(foo), "one more time")
+	assert.Equal(t, ToString(nil), "")
+}
+
 func TestMaps(t *testing.T) {
 	var taxonomies = map[interface{}]interface{}{"tag": "tags", "group": "groups"}
 	assert.Equal(t, ToStringMap(taxonomies), map[string]interface{}{"tag": "tags", "group": "groups"})
diff --git a/caste.go b/caste.go
index 49025fc..80be149 100644
--- a/caste.go
+++ b/caste.go
@@ -53,6 +53,84 @@
 	return false, false
 }
 
+func ToFloat64E(i interface{}) (float64, bool) {
+	switch s := i.(type) {
+	case float64:
+		return s, true
+	case float32:
+		return float64(s), true
+	case string:
+		v, err := strconv.ParseFloat(s, 64)
+		if err == nil {
+			return float64(v), true
+		} else {
+			jww.ERROR.Printf("Unable to Cast %#v to float", i)
+			jww.ERROR.Println(err)
+		}
+
+	default:
+		jww.ERROR.Printf("Unable to Cast %#v to float", i)
+	}
+
+	return 0.0, false
+}
+
+func ToIntE(i interface{}) (int, bool) {
+	switch s := i.(type) {
+	case int:
+		return s, true
+	case int64:
+		return int(s), true
+	case int32:
+		return int(s), true
+	case int16:
+		return int(s), true
+	case int8:
+		return int(s), true
+	case string:
+		v, err := strconv.ParseInt(s, 0, 0)
+		if err == nil {
+			return int(v), true
+		} else {
+			jww.ERROR.Printf("Unable to Cast %#v to int", i)
+			jww.ERROR.Println(err)
+		}
+	case float64:
+		return int(s), true
+	case bool:
+		if bool(s) {
+			return 1, true
+		} else {
+			return 0, true
+		}
+	case nil:
+		return 0, true
+	default:
+		jww.ERROR.Printf("Unable to Cast %#v to int", i)
+	}
+
+	return 0, false
+}
+
+func ToStringE(i interface{}) (string, bool) {
+	switch s := i.(type) {
+	case string:
+		return s, true
+	case float64:
+		return strconv.FormatFloat(i.(float64), 'f', -1, 64), true
+	case int:
+		return strconv.FormatInt(int64(i.(int)), 10), true
+	case []byte:
+		return string(s), true
+	case nil:
+		return "", true
+	default:
+		jww.ERROR.Printf("Unable to Cast %#v to string", i)
+	}
+
+	return "", false
+}
+
 func ToStringMapStringE(i interface{}) (map[string]string, bool) {
 	var m = map[string]string{}
 
@@ -98,79 +176,6 @@
 	return a, true
 }
 
-func ToFloat64E(i interface{}) (float64, bool) {
-	switch s := i.(type) {
-	case float64:
-		return s, true
-	case float32:
-		return float64(s), true
-
-	case string:
-		v, err := strconv.ParseFloat(s, 64)
-		if err == nil {
-			return float64(v), true
-		} else {
-			jww.ERROR.Printf("Unable to Cast %#v to float", i)
-			jww.ERROR.Println(err)
-		}
-
-	default:
-		jww.ERROR.Printf("Unable to Cast %#v to float", i)
-	}
-
-	return 0.0, false
-}
-
-func ToIntE(i interface{}) (int, bool) {
-	switch s := i.(type) {
-	case int:
-		return s, true
-	case int64:
-		return int(s), true
-	case int32:
-		return int(s), true
-	case int16:
-		return int(s), true
-	case int8:
-		return int(s), true
-	case string:
-		v, err := strconv.ParseInt(s, 0, 0)
-		if err == nil {
-			return int(v), true
-		} else {
-			jww.ERROR.Printf("Unable to Cast %#v to int", i)
-			jww.ERROR.Println(err)
-		}
-	case bool:
-		if bool(s) {
-			return 1, true
-		} else {
-			return 0, true
-		}
-	default:
-		jww.ERROR.Printf("Unable to Cast %#v to int", i)
-	}
-
-	return 0, false
-}
-
-func ToStringE(i interface{}) (string, bool) {
-	switch s := i.(type) {
-	case string:
-		return s, true
-	case float64:
-		return strconv.FormatFloat(i.(float64), 'f', -1, 64), true
-	case int:
-		return strconv.FormatInt(int64(i.(int)), 10), true
-	case nil:
-		return "", true
-	default:
-		jww.ERROR.Printf("Unable to Cast %#v to string", i)
-	}
-
-	return "", false
-}
-
 func StringToDate(s string) (time.Time, error) {
 	return parseDateWith(s, []string{
 		time.RFC3339,
