Support all numeric type conversions (#102)

Fixes #101
diff --git a/parser_test.go b/parser_test.go
index 8f80a14..5b78bc3 100644
--- a/parser_test.go
+++ b/parser_test.go
@@ -627,7 +627,17 @@
 		Value  interface{}
 		Expect string
 	}{
+		{int(1), "1"},
+		{int8(2), "2"},
+		{int16(3), "3"},
+		{int32(4), "4"},
 		{int64(12345), "12345"},
+		{uint(10), "10"},
+		{uint8(20), "20"},
+		{uint16(30), "30"},
+		{uint32(40), "40"},
+		{uint64(50), "50"},
+		{float32(12.456), "12.456"},
 		{float64(123.45), "123.45"},
 		{bool(true), "true"},
 		{"hello world", "\"hello world\""},
diff --git a/tomltree_conversions.go b/tomltree_conversions.go
index c9c6f95..ae03189 100644
--- a/tomltree_conversions.go
+++ b/tomltree_conversions.go
@@ -45,8 +45,28 @@
 func toTomlValue(item interface{}, indent int) string {
 	tab := strings.Repeat(" ", indent)
 	switch value := item.(type) {
+	case int:
+		return tab + strconv.FormatInt(int64(value), 10)
+	case int8:
+		return tab + strconv.FormatInt(int64(value), 10)
+	case int16:
+		return tab + strconv.FormatInt(int64(value), 10)
+	case int32:
+		return tab + strconv.FormatInt(int64(value), 10)
 	case int64:
 		return tab + strconv.FormatInt(value, 10)
+	case uint:
+		return tab + strconv.FormatUint(uint64(value), 10)
+	case uint8:
+		return tab + strconv.FormatUint(uint64(value), 10)
+	case uint16:
+		return tab + strconv.FormatUint(uint64(value), 10)
+	case uint32:
+		return tab + strconv.FormatUint(uint64(value), 10)
+	case uint64:
+		return tab + strconv.FormatUint(value, 10)
+	case float32:
+		return tab + strconv.FormatFloat(float64(value), 'f', -1, 32)
 	case float64:
 		return tab + strconv.FormatFloat(value, 'f', -1, 64)
 	case string:
@@ -65,7 +85,7 @@
 		}
 		return result + tab + "]"
 	default:
-		panic(fmt.Sprintf("unsupported value type: %v", value))
+		panic(fmt.Sprintf("unsupported value type %T: %v", value, value))
 	}
 }