diff --git a/cue/context.go b/cue/context.go
index f9726f3..1ff8163 100644
--- a/cue/context.go
+++ b/cue/context.go
@@ -212,6 +212,10 @@
 // The returned Value will represent an error, accessible through Err, if any
 // error occurred.
 func (c *Context) Encode(x interface{}, option ...EncodeOption) Value {
+	switch v := x.(type) {
+	case adt.Value:
+		return newValueRoot(c.index(), c.ctx(), v)
+	}
 	var options encodeOptions
 	options.process(option)
 
diff --git a/cue/types.go b/cue/types.go
index 81af9a3..86ac88e 100644
--- a/cue/types.go
+++ b/cue/types.go
@@ -632,17 +632,6 @@
 	return makeValue(v.idx, n)
 }
 
-// MakeValue converts an adt.Value and given OpContext to a Value. The context
-// must be directly or indirectly obtained from the NewRuntime defined in this
-// package and it will panic if this is not the case.
-//
-// For internal use only.
-func MakeValue(ctx *adt.OpContext, v adt.Value) Value {
-	index := ctx.Impl().(*runtime.Runtime)
-
-	return newValueRoot(index, newContext(index), v)
-}
-
 func makeValue(idx *runtime.Runtime, v *adt.Vertex) Value {
 	if v.Status() == 0 || v.BaseValue == nil {
 		panic(fmt.Sprintf("not properly initialized (state: %v, value: %T)",
diff --git a/internal/core/dep/dep_test.go b/internal/core/dep/dep_test.go
index 449279b..c1c0330 100644
--- a/internal/core/dep/dep_test.go
+++ b/internal/core/dep/dep_test.go
@@ -72,7 +72,7 @@
 
 			t.Run(tc.name, func(sub *testing.T) {
 				tc.fn(ctxt, n, func(d dep.Dependency) error {
-					str := cue.MakeValue(ctxt, d.Node).Path().String()
+					str := value.Make(ctxt, d.Node).Path().String()
 					if i := d.Import(); i != nil {
 						path := i.ImportPath.StringValue(ctxt)
 						str = fmt.Sprintf("%q.%s", path, str)
@@ -114,7 +114,7 @@
 	deps := []string{}
 
 	_ = dep.VisitFields(ctxt, n, func(d dep.Dependency) error {
-		str := cue.MakeValue(ctxt, d.Node).Path().String()
+		str := value.Make(ctxt, d.Node).Path().String()
 		if i := d.Import(); i != nil {
 			path := i.ImportPath.StringValue(ctxt)
 			str = fmt.Sprintf("%q.%s", path, str)
diff --git a/internal/value/value.go b/internal/value/value.go
index f5a4662..a91343b 100644
--- a/internal/value/value.go
+++ b/internal/value/value.go
@@ -39,6 +39,11 @@
 }
 
 // TODO:
+// Make wraps cue.MakeValue.
+func Make(ctx *adt.OpContext, v adt.Value) cue.Value {
+	return (*cue.Context)(ctx.Impl().(*runtime.Runtime)).Encode(v)
+}
+
 //
 // func Make(r *runtime.Runtime, v *adt.Vertex) cue.Value {
 // 	return cue.Value{}
diff --git a/pkg/internal/context.go b/pkg/internal/context.go
index 9aa29ae..a8ff4fd 100644
--- a/pkg/internal/context.go
+++ b/pkg/internal/context.go
@@ -21,6 +21,7 @@
 	"cuelang.org/go/cue"
 	"cuelang.org/go/cue/token"
 	"cuelang.org/go/internal/core/adt"
+	"cuelang.org/go/internal/value"
 	"github.com/cockroachdb/apd/v2"
 )
 
@@ -48,7 +49,7 @@
 }
 
 func (c *CallCtxt) Value(i int) cue.Value {
-	v := cue.MakeValue(c.ctx, c.args[i])
+	v := value.Make(c.ctx, c.args[i])
 	// TODO: remove default
 	// v, _ = v.Default()
 	if !v.IsConcrete() {
@@ -58,7 +59,7 @@
 }
 
 func (c *CallCtxt) Struct(i int) *cue.Struct {
-	v := cue.MakeValue(c.ctx, c.args[i])
+	v := value.Make(c.ctx, c.args[i])
 	s, err := v.Struct()
 	if err != nil {
 		c.invalidArgType(c.args[i], i, "struct", err)
@@ -76,7 +77,7 @@
 
 func (c *CallCtxt) intValue(i, bits int, typ string) int64 {
 	arg := c.args[i]
-	x := cue.MakeValue(c.ctx, arg)
+	x := value.Make(c.ctx, arg)
 	n, err := x.Int(nil)
 	if err != nil {
 		c.invalidArgType(arg, i, typ, err)
@@ -98,7 +99,7 @@
 func (c *CallCtxt) Uint64(i int) uint64 { return uint64(c.uintValue(i, 64, "uint64")) }
 
 func (c *CallCtxt) uintValue(i, bits int, typ string) uint64 {
-	x := cue.MakeValue(c.ctx, c.args[i])
+	x := value.Make(c.ctx, c.args[i])
 	n, err := x.Int(nil)
 	if err != nil || n.Sign() < 0 {
 		c.invalidArgType(c.args[i], i, typ, err)
@@ -113,7 +114,7 @@
 }
 
 func (c *CallCtxt) Decimal(i int) *apd.Decimal {
-	x := cue.MakeValue(c.ctx, c.args[i])
+	x := value.Make(c.ctx, c.args[i])
 	if _, err := x.MantExp(nil); err != nil {
 		c.invalidArgType(c.args[i], i, "Decimal", err)
 		return nil
@@ -122,7 +123,7 @@
 }
 
 func (c *CallCtxt) Float64(i int) float64 {
-	x := cue.MakeValue(c.ctx, c.args[i])
+	x := value.Make(c.ctx, c.args[i])
 	res, err := x.Float64()
 	if err != nil {
 		c.invalidArgType(c.args[i], i, "float64", err)
@@ -132,7 +133,7 @@
 }
 
 func (c *CallCtxt) BigInt(i int) *big.Int {
-	x := cue.MakeValue(c.ctx, c.args[i])
+	x := value.Make(c.ctx, c.args[i])
 	n, err := x.Int(nil)
 	if err != nil {
 		c.invalidArgType(c.args[i], i, "int", err)
@@ -144,7 +145,7 @@
 var ten = big.NewInt(10)
 
 func (c *CallCtxt) BigFloat(i int) *big.Float {
-	x := cue.MakeValue(c.ctx, c.args[i])
+	x := value.Make(c.ctx, c.args[i])
 	var mant big.Int
 	exp, err := x.MantExp(&mant)
 	if err != nil {
@@ -163,7 +164,7 @@
 
 func (c *CallCtxt) String(i int) string {
 	// TODO: use Evaluate instead.
-	x := cue.MakeValue(c.ctx, c.args[i])
+	x := value.Make(c.ctx, c.args[i])
 	v, err := x.String()
 	if err != nil {
 		c.invalidArgType(c.args[i], i, "string", err)
@@ -173,7 +174,7 @@
 }
 
 func (c *CallCtxt) Bytes(i int) []byte {
-	x := cue.MakeValue(c.ctx, c.args[i])
+	x := value.Make(c.ctx, c.args[i])
 	v, err := x.Bytes()
 	if err != nil {
 		c.invalidArgType(c.args[i], i, "bytes", err)
@@ -183,7 +184,7 @@
 }
 
 func (c *CallCtxt) Reader(i int) io.Reader {
-	x := cue.MakeValue(c.ctx, c.args[i])
+	x := value.Make(c.ctx, c.args[i])
 	// TODO: optimize for string and bytes cases
 	r, err := x.Reader()
 	if err != nil {
@@ -194,7 +195,7 @@
 }
 
 func (c *CallCtxt) Bool(i int) bool {
-	x := cue.MakeValue(c.ctx, c.args[i])
+	x := value.Make(c.ctx, c.args[i])
 	b, err := x.Bool()
 	if err != nil {
 		c.invalidArgType(c.args[i], i, "bool", err)
@@ -205,7 +206,7 @@
 
 func (c *CallCtxt) List(i int) (a []cue.Value) {
 	arg := c.args[i]
-	x := cue.MakeValue(c.ctx, arg)
+	x := value.Make(c.ctx, arg)
 	v, err := x.List()
 	if err != nil {
 		c.invalidArgType(c.args[i], i, "list", err)
@@ -219,7 +220,7 @@
 
 func (c *CallCtxt) Iter(i int) (a cue.Iterator) {
 	arg := c.args[i]
-	x := cue.MakeValue(c.ctx, arg)
+	x := value.Make(c.ctx, arg)
 	v, err := x.List()
 	if err != nil {
 		c.invalidArgType(c.args[i], i, "list", err)
diff --git a/tools/flow/run.go b/tools/flow/run.go
index 91336b1..bf61786 100644
--- a/tools/flow/run.go
+++ b/tools/flow/run.go
@@ -26,7 +26,6 @@
 // future tasks may be long running, as discussed above.
 
 import (
-	"cuelang.org/go/cue"
 	"cuelang.org/go/cue/errors"
 	"cuelang.org/go/internal/core/adt"
 	"cuelang.org/go/internal/core/eval"
@@ -153,7 +152,7 @@
 	v := &adt.Vertex{Conjuncts: c.conjuncts}
 	v.Finalize(c.opCtx)
 
-	c.inst = cue.MakeValue(c.opCtx, v)
+	c.inst = value.Make(c.opCtx, v)
 	c.valueSeqNum = c.conjunctSeq
 	return true
 }
diff --git a/tools/flow/tasks.go b/tools/flow/tasks.go
index a09e680..519a386 100644
--- a/tools/flow/tasks.go
+++ b/tools/flow/tasks.go
@@ -192,7 +192,7 @@
 		}
 
 		if !d.IsRoot() {
-			v := cue.MakeValue(c.opCtx, n)
+			v := value.Make(c.opCtx, n)
 
 			if t := c.getTask(nil, v); t != nil {
 				return t
@@ -225,7 +225,7 @@
 		depTask := c.findImpliedTask(d)
 		if depTask != nil {
 			if depTask != cycleMarker {
-				v := cue.MakeValue(c.opCtx, d.Node)
+				v := value.Make(c.opCtx, d.Node)
 				t.addDep(v.Path().String(), depTask)
 			}
 			return nil
@@ -245,7 +245,7 @@
 }
 
 func (c *Controller) inRoot(n *adt.Vertex) bool {
-	path := cue.MakeValue(c.opCtx, n).Path().Selectors()
+	path := value.Make(c.opCtx, n).Path().Selectors()
 	root := c.cfg.Root.Selectors()
 	if len(path) < len(root) {
 		return false
