diff --git a/tfexec/upgrade013.go b/tfexec/upgrade013.go
new file mode 100644
index 0000000..f1f444e
--- /dev/null
+++ b/tfexec/upgrade013.go
@@ -0,0 +1,68 @@
+package tfexec
+
+import (
+	"context"
+	"fmt"
+	"os/exec"
+)
+
+type upgrade013Config struct {
+	dir string
+
+	reattachInfo ReattachInfo
+}
+
+var defaultUpgrade013Options = upgrade013Config{}
+
+// Upgrade013Option represents options used in the Destroy method.
+type Upgrade013Option interface {
+	configureUpgrade013(*upgrade013Config)
+}
+
+func (opt *DirOption) configureUpgrade013(conf *upgrade013Config) {
+	conf.dir = opt.path
+}
+
+func (opt *ReattachOption) configureUpgrade013(conf *upgrade013Config) {
+	conf.reattachInfo = opt.info
+}
+
+// Upgrade013 represents the terraform 0.13upgrade subcommand.
+func (tf *Terraform) Upgrade013(ctx context.Context, opts ...Upgrade013Option) error {
+	cmd, err := tf.upgrade013Cmd(ctx, opts...)
+	if err != nil {
+		return err
+	}
+	return tf.runTerraformCmd(ctx, cmd)
+}
+
+func (tf *Terraform) upgrade013Cmd(ctx context.Context, opts ...Upgrade013Option) (*exec.Cmd, error) {
+	err := tf.compatible(ctx, tf0_13_0, tf0_14_0)
+	if err != nil {
+		return nil, fmt.Errorf("terraform 0.13upgrade is only supported in 0.13 releases: %w", err)
+	}
+
+	c := defaultUpgrade013Options
+
+	for _, o := range opts {
+		o.configureUpgrade013(&c)
+	}
+
+	args := []string{"0.13upgrade", "-no-color", "-yes"}
+
+	// optional positional argument
+	if c.dir != "" {
+		args = append(args, c.dir)
+	}
+
+	mergeEnv := map[string]string{}
+	if c.reattachInfo != nil {
+		reattachStr, err := c.reattachInfo.marshalString()
+		if err != nil {
+			return nil, err
+		}
+		mergeEnv[reattachEnvVar] = reattachStr
+	}
+
+	return tf.buildTerraformCmd(ctx, mergeEnv, args...), nil
+}
diff --git a/tfexec/upgrade013_test.go b/tfexec/upgrade013_test.go
new file mode 100644
index 0000000..7a6220d
--- /dev/null
+++ b/tfexec/upgrade013_test.go
@@ -0,0 +1,85 @@
+package tfexec
+
+import (
+	"context"
+	"errors"
+	"fmt"
+	"testing"
+
+	"github.com/hashicorp/terraform-exec/tfexec/internal/testutil"
+)
+
+func TestUpgrade013(t *testing.T) {
+	td := testTempDir(t)
+
+	t.Run("defaults", func(t *testing.T) {
+		tf, err := NewTerraform(td, tfVersion(t, testutil.Latest013))
+		if err != nil {
+			t.Fatal(err)
+		}
+
+		// empty env, to avoid environ mismatch in testing
+		tf.SetEnv(map[string]string{})
+
+		upgrade013Cmd, err := tf.upgrade013Cmd(context.Background())
+		if err != nil {
+			t.Fatal(err)
+		}
+
+		assertCmd(t, []string{
+			"0.13upgrade",
+			"-no-color",
+			"-yes",
+		}, nil, upgrade013Cmd)
+	})
+
+	t.Run("override all defaults", func(t *testing.T) {
+		tf, err := NewTerraform(td, tfVersion(t, testutil.Latest013))
+		if err != nil {
+			t.Fatal(err)
+		}
+
+		// empty env, to avoid environ mismatch in testing
+		tf.SetEnv(map[string]string{})
+
+		upgrade013Cmd, err := tf.upgrade013Cmd(context.Background(), Dir("upgrade013dir"))
+		if err != nil {
+			t.Fatal(err)
+		}
+
+		assertCmd(t, []string{
+			"0.13upgrade",
+			"-no-color",
+			"-yes",
+			"upgrade013dir",
+		}, nil, upgrade013Cmd)
+	})
+
+	unsupportedVersions := []string{
+		testutil.Latest011,
+		testutil.Latest012,
+		testutil.Latest014,
+		testutil.Latest015,
+	}
+	for _, tfv := range unsupportedVersions {
+		t.Run(fmt.Sprintf("unsupported on %s", tfv), func(t *testing.T) {
+			tf, err := NewTerraform(td, tfVersion(t, tfv))
+			if err != nil {
+				t.Fatal(err)
+			}
+
+			// empty env, to avoid environ mismatch in testing
+			tf.SetEnv(map[string]string{})
+
+			_, err = tf.upgrade013Cmd(context.Background())
+			if err == nil {
+				t.Fatalf("expected unsupported version %s to fail", tfv)
+			}
+
+			var expectedErr *ErrVersionMismatch
+			if !errors.As(err, &expectedErr) {
+				t.Fatalf("error doesn't match: %#v", err)
+			}
+		})
+	}
+}
diff --git a/tfexec/version.go b/tfexec/version.go
index b6496ab..2e842a8 100644
--- a/tfexec/version.go
+++ b/tfexec/version.go
@@ -10,13 +10,14 @@
 	"strings"
 
 	"github.com/hashicorp/go-version"
-	"github.com/hashicorp/terraform-json"
+	tfjson "github.com/hashicorp/terraform-json"
 )
 
 var (
 	tf0_7_7  = version.Must(version.NewVersion("0.7.7"))
 	tf0_12_0 = version.Must(version.NewVersion("0.12.0"))
 	tf0_13_0 = version.Must(version.NewVersion("0.13.0"))
+	tf0_14_0 = version.Must(version.NewVersion("0.14.0"))
 	tf0_15_0 = version.Must(version.NewVersion("0.15.0"))
 )
 
