diff --git a/cmd/cue/cmd/import.go b/cmd/cue/cmd/import.go
index 89a48ea..574bf59 100644
--- a/cmd/cue/cmd/import.go
+++ b/cmd/cue/cmd/import.go
@@ -423,7 +423,7 @@
 
 		switch {
 		case flagPath.String(cmd) != "":
-			inst, err := runtime.FromExpr(expr)
+			inst, err := runtime.CompileExpr(expr)
 			if err != nil {
 				return err
 			}
diff --git a/cue/build.go b/cue/build.go
index c1a6b70..6883249 100644
--- a/cue/build.go
+++ b/cue/build.go
@@ -56,10 +56,68 @@
 	return inst, nil
 }
 
+// Compile compiles the given source into an Instance. The source code may be
+// provided as a string, byte slice, io.Reader. The name is used as the file
+// name in position information. The source may import builtin packages. Use
+// Build to allow importing non-builtin packages.
+func (r *Runtime) Compile(filename string, source interface{}) (*Instance, error) {
+	ctx := r.Context
+	if ctx == nil {
+		ctx = build.NewContext()
+	}
+	p := ctx.NewInstance(filename, dummyLoad)
+	if err := p.AddFile(filename, source); err != nil {
+		return nil, p.Err
+	}
+	return r.complete(p)
+}
+
+// CompileFile compiles the given source file into an Instance. The source may
+// import builtin packages. Use Build to allow importing non-builtin packages.
+func (r *Runtime) CompileFile(file *ast.File) (*Instance, error) {
+	ctx := r.Context
+	if ctx == nil {
+		ctx = build.NewContext()
+	}
+	p := ctx.NewInstance(file.Filename, dummyLoad)
+	err := p.AddSyntax(file)
+	if err != nil {
+		return nil, err
+	}
+	if file.Name != nil {
+		p.PkgName = file.Name.Name
+	}
+	return r.complete(p)
+}
+
+// CompileExpr compiles the given source expression into an Instance. The source
+// may import builtin packages. Use Build to allow importing non-builtin
+// packages.
+func (r *Runtime) CompileExpr(expr ast.Expr) (*Instance, error) {
+	ctx := r.Context
+	if ctx == nil {
+		ctx = build.NewContext()
+	}
+	p := ctx.NewInstance("", dummyLoad)
+	switch x := expr.(type) {
+	case *ast.StructLit:
+		_ = p.AddSyntax(&ast.File{Decls: x.Elts})
+	default:
+		_ = p.AddSyntax(&ast.File{
+			Decls: []ast.Decl{&ast.EmitDecl{Expr: expr}},
+		})
+	}
+	if p.Err != nil {
+		return nil, p.Err
+	}
+	return r.complete(p)
+}
+
 // Parse parses a CUE source value into a CUE Instance. The source code may
 // be provided as a string, byte slice, or io.Reader. The name is used as the
 // file name in position information. The source may import builtin packages.
 //
+// Deprecated: use Compile
 func (r *Runtime) Parse(name string, source interface{}) (*Instance, error) {
 	ctx := r.Context
 	if ctx == nil {
@@ -104,6 +162,8 @@
 
 // FromExpr creates an instance from an expression.
 // Any references must be resolved beforehand.
+//
+// Deprecated: use CompileExpr
 func (r *Runtime) FromExpr(expr ast.Expr) (*Instance, error) {
 	i := r.index().newInstance(nil)
 	err := i.insertFile(&ast.File{
diff --git a/cue/build/instance.go b/cue/build/instance.go
index c599e8f..f0c9ce9 100644
--- a/cue/build/instance.go
+++ b/cue/build/instance.go
@@ -171,16 +171,12 @@
 		return err
 	}
 
-	if err := inst.addSyntax(file); err != nil {
-		inst.ReportError(err)
-		return err
-	}
-	return nil
+	return inst.AddSyntax(file)
 }
 
-// addSyntax adds the given file to list of files for this instance. The package
+// AddSyntax adds the given file to list of files for this instance. The package
 // name of the file must match the package name of the instance.
-func (inst *Instance) addSyntax(file *ast.File) errors.Error {
+func (inst *Instance) AddSyntax(file *ast.File) errors.Error {
 	pkg := ""
 	pos := file.Pos()
 	if file.Name != nil {
@@ -188,9 +184,11 @@
 		pos = file.Name.Pos()
 	}
 	if !inst.setPkg(pkg) && pkg != inst.PkgName {
-		return errors.Newf(pos,
+		err := errors.Newf(pos,
 			"package name %q conflicts with previous package name %q",
 			pkg, inst.PkgName)
+		inst.ReportError(err)
+		return err
 	}
 	inst.Files = append(inst.Files, file)
 	return nil
diff --git a/cue/build_test.go b/cue/build_test.go
index 4369f43..da37549 100644
--- a/cue/build_test.go
+++ b/cue/build_test.go
@@ -41,7 +41,7 @@
 	for _, tc := range testCases {
 		t.Run("", func(t *testing.T) {
 			r := &Runtime{}
-			inst, err := r.FromExpr(tc.expr)
+			inst, err := r.CompileExpr(tc.expr)
 			if err != nil {
 				t.Fatal(err)
 			}
diff --git a/pkg/tool/file/file_test.go b/pkg/tool/file/file_test.go
index e82081f..b284445 100644
--- a/pkg/tool/file/file_test.go
+++ b/pkg/tool/file/file_test.go
@@ -35,7 +35,7 @@
 		t.Fatal(err)
 	}
 	var r cue.Runtime
-	i, err := r.FromExpr(x)
+	i, err := r.CompileExpr(x)
 	if err != nil {
 		t.Fatal(err)
 	}
