Updated to current weekly.
diff --git a/decode.go b/decode.go
index 3a3dee9..4bb5130 100644
--- a/decode.go
+++ b/decode.go
@@ -235,7 +235,7 @@
 		if tag != "!!null" || setter != nil {
 			if pv := (*out); pv.Kind() == reflect.Ptr {
 				if pv.IsNil() {
-					*out = reflect.Zero(pv.Type().Elem())
+					*out = reflect.New(pv.Type().Elem()).Elem()
 					pv.Set((*out).Addr())
 				} else {
 					*out = pv.Elem()
@@ -246,7 +246,7 @@
 		}
 		if setter != nil {
 			var arg interface{}
-			*out = reflect.NewValue(&arg).Elem()
+			*out = reflect.ValueOf(&arg).Elem()
 			return func() {
 				*good = setter.SetYAML(tag, arg)
 			}
@@ -315,7 +315,7 @@
 		if resolved == nil {
 			out.Set(reflect.Zero(out.Type()))
 		} else {
-			out.Set(reflect.NewValue(resolved))
+			out.Set(reflect.ValueOf(resolved))
 		}
 		good = true
 	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
@@ -368,6 +368,13 @@
 	return good
 }
 
+func settableValueOf(i interface{}) reflect.Value {
+	v := reflect.ValueOf(i)
+	sv := reflect.New(v.Type()).Elem()
+	sv.Set(v)
+	return sv
+}
+
 func (d *decoder) sequence(n *node, out reflect.Value) (good bool) {
 	if set := d.setter("!!seq", &out, &good); set != nil {
 		defer set()
@@ -375,7 +382,7 @@
 	if out.Kind() == reflect.Interface {
 		// No type hints. Will have to use a generic sequence.
 		iface := out
-		out = reflect.NewValue(make([]interface{}, 0))
+		out = settableValueOf(make([]interface{}, 0))
 		iface.Set(out)
 	}
 
@@ -386,7 +393,7 @@
 
 	l := len(n.children)
 	for i := 0; i < l; i++ {
-		e := reflect.Zero(et)
+		e := reflect.New(et).Elem()
 		if ok := d.unmarshal(n.children[i], e); ok {
 			out.Set(reflect.Append(out, e))
 		}
@@ -405,7 +412,7 @@
 	if out.Kind() == reflect.Interface {
 		// No type hints. Will have to use a generic map.
 		iface := out
-		out = reflect.NewValue(make(map[interface{}]interface{}))
+		out = settableValueOf(make(map[interface{}]interface{}))
 		iface.Set(out)
 	}
 
@@ -418,9 +425,9 @@
 
 	l := len(n.children)
 	for i := 0; i < l; i += 2 {
-		k := reflect.Zero(kt)
+		k := reflect.New(kt).Elem()
 		if d.unmarshal(n.children[i], k) {
-			e := reflect.Zero(et)
+			e := reflect.New(et).Elem()
 			if d.unmarshal(n.children[i+1], e) {
 				out.SetMapIndex(k, e)
 			}
@@ -434,7 +441,7 @@
 	if err != nil {
 		panic(err)
 	}
-	name := reflect.NewValue("")
+	name := settableValueOf("")
 	fieldsMap := fields.Map
 	l := len(n.children)
 	for i := 0; i < l; i += 2 {
diff --git a/decode_test.go b/decode_test.go
index 5c80a20..3f5f60a 100644
--- a/decode_test.go
+++ b/decode_test.go
@@ -134,14 +134,13 @@
 
 func (s *S) TestUnmarshal(c *C) {
 	for i, item := range unmarshalTests {
-		t := reflect.NewValue(item.value).Type()
+		t := reflect.ValueOf(item.value).Type()
 		var value interface{}
 		if t.Kind() == reflect.Map {
 			value = reflect.MakeMap(t).Interface()
 		} else {
-			pt := reflect.NewValue(item.value).Type()
-			pv := reflect.Zero(pt)
-			pv.Set(reflect.Zero(pt.Elem()).Addr())
+			pt := reflect.ValueOf(item.value).Type()
+			pv := reflect.New(pt.Elem())
 			value = pv.Interface()
 		}
 		err := goyaml.Unmarshal([]byte(item.data), value)
@@ -153,8 +152,7 @@
 var unmarshalErrorTests = []struct {
 	data, error string
 }{
-	{"v: !!float 'error'",
-		"YAML error: Can't decode !!str 'error' as a !!float"},
+	{"v: !!float 'error'", "YAML error: Can't decode !!str 'error' as a !!float"},
 	{"v: [A,", "YAML error: line 1: did not find expected node content"},
 	{"v:\n- [A,", "YAML error: line 2: did not find expected node content"},
 	{"a: *b\n", "YAML error: Unknown anchor 'b' referenced"},
diff --git a/encode.go b/encode.go
index 242a722..ba15123 100644
--- a/encode.go
+++ b/encode.go
@@ -90,7 +90,7 @@
 			e.nilv()
 			return
 		}
-		in = reflect.NewValue(value)
+		in = reflect.ValueOf(value)
 	}
 	switch in.Kind() {
 	case reflect.Interface:
@@ -146,7 +146,7 @@
 			if info.Conditional && isZero(value) {
 				continue
 			}
-			e.marshal("", reflect.NewValue(info.Key))
+			e.marshal("", reflect.ValueOf(info.Key))
 			e.flow = info.Flow
 			e.marshal("", value)
 		}
diff --git a/goyaml.go b/goyaml.go
index 6d69268..3ea8332 100644
--- a/goyaml.go
+++ b/goyaml.go
@@ -88,7 +88,7 @@
 	defer p.destroy()
 	node := p.parse()
 	if node != nil {
-		d.unmarshal(node, reflect.NewValue(out))
+		d.unmarshal(node, reflect.ValueOf(out))
 	}
 	return nil
 }
@@ -119,7 +119,7 @@
 	defer handleErr(&err)
 	e := newEncoder()
 	defer e.destroy()
-	e.marshal("", reflect.NewValue(in))
+	e.marshal("", reflect.ValueOf(in))
 	e.finish()
 	out = e.out
 	return