diff --git a/internal/imports/fix.go b/internal/imports/fix.go
index 818d443..e3f9dcb 100644
--- a/internal/imports/fix.go
+++ b/internal/imports/fix.go
@@ -27,7 +27,6 @@
 	"unicode/utf8"
 
 	"golang.org/x/tools/go/ast/astutil"
-	"golang.org/x/tools/go/packages"
 	"golang.org/x/tools/internal/gopathwalk"
 )
 
@@ -725,9 +724,6 @@
 	GOPATH, GOROOT, GO111MODULE, GOPROXY, GOFLAGS, GOSUMDB string
 	WorkingDir                                             string
 
-	// If true, use go/packages regardless of the environment.
-	ForceGoPackages bool
-
 	// Logf is the default logger for the ProcessEnv.
 	Logf func(format string, args ...interface{})
 
@@ -757,11 +753,6 @@
 	if e.resolver != nil {
 		return e.resolver
 	}
-	if e.ForceGoPackages {
-		e.resolver = &goPackagesResolver{env: e}
-		return e.resolver
-	}
-
 	out, err := e.invokeGo("env", "GOMOD")
 	if err != nil || len(bytes.TrimSpace(out.Bytes())) == 0 {
 		e.resolver = &gopathResolver{env: e}
@@ -771,14 +762,6 @@
 	return e.resolver
 }
 
-func (e *ProcessEnv) newPackagesConfig(mode packages.LoadMode) *packages.Config {
-	return &packages.Config{
-		Mode: mode,
-		Dir:  e.WorkingDir,
-		Env:  e.env(),
-	}
-}
-
 func (e *ProcessEnv) buildContext() *build.Context {
 	ctx := build.Default
 	ctx.GOROOT = e.GOROOT
@@ -867,81 +850,6 @@
 	ClearForNewScan()
 }
 
-// gopackagesResolver implements resolver for GOPATH and module workspaces using go/packages.
-type goPackagesResolver struct {
-	env *ProcessEnv
-}
-
-func (r *goPackagesResolver) ClearForNewScan() {}
-
-func (r *goPackagesResolver) loadPackageNames(importPaths []string, srcDir string) (map[string]string, error) {
-	if len(importPaths) == 0 {
-		return nil, nil
-	}
-	cfg := r.env.newPackagesConfig(packages.LoadFiles)
-	pkgs, err := packages.Load(cfg, importPaths...)
-	if err != nil {
-		return nil, err
-	}
-	names := map[string]string{}
-	for _, pkg := range pkgs {
-		names[VendorlessPath(pkg.PkgPath)] = pkg.Name
-	}
-	// We may not have found all the packages. Guess the rest.
-	for _, path := range importPaths {
-		if _, ok := names[path]; ok {
-			continue
-		}
-		names[path] = ImportPathToAssumedName(path)
-	}
-	return names, nil
-
-}
-
-func (r *goPackagesResolver) scan(refs references, _ bool, _ []gopathwalk.RootType) ([]*pkg, error) {
-	var loadQueries []string
-	for pkgName := range refs {
-		loadQueries = append(loadQueries, "iamashamedtousethedisabledqueryname="+pkgName)
-	}
-	sort.Strings(loadQueries)
-	cfg := r.env.newPackagesConfig(packages.LoadFiles)
-	goPackages, err := packages.Load(cfg, loadQueries...)
-	if err != nil {
-		return nil, err
-	}
-
-	var scan []*pkg
-	for _, goPackage := range goPackages {
-		scan = append(scan, &pkg{
-			dir:             filepath.Dir(goPackage.CompiledGoFiles[0]),
-			importPathShort: VendorlessPath(goPackage.PkgPath),
-			goPackage:       goPackage,
-			packageName:     goPackage.Name,
-		})
-	}
-	return scan, nil
-}
-
-func (r *goPackagesResolver) loadExports(ctx context.Context, pkg *pkg) (string, []string, error) {
-	if pkg.goPackage == nil {
-		return "", nil, fmt.Errorf("goPackage not set")
-	}
-	var exports []string
-	fset := token.NewFileSet()
-	for _, fname := range pkg.goPackage.CompiledGoFiles {
-		f, err := parser.ParseFile(fset, fname, nil, 0)
-		if err != nil {
-			return "", nil, fmt.Errorf("parsing %s: %v", fname, err)
-		}
-		for name := range f.Scope.Objects {
-			if ast.IsExported(name) {
-				exports = append(exports, name)
-			}
-		}
-	}
-	return pkg.goPackage.Name, exports, nil
-}
-
 func addExternalCandidates(pass *pass, refs references, filename string) error {
 	dirScan, err := pass.env.GetResolver().scan(refs, false, nil)
 	if err != nil {
@@ -1138,7 +1046,6 @@
 }
 
 type pkg struct {
-	goPackage       *packages.Package
 	dir             string // absolute file path to pkg directory ("/usr/lib/go/src/net/http")
 	importPathShort string // vendorless import path ("net/http", "a/b")
 	packageName     string // package name loaded from source if requested
diff --git a/internal/imports/fix_test.go b/internal/imports/fix_test.go
index 327edeb..bf6c0fc 100644
--- a/internal/imports/fix_test.go
+++ b/internal/imports/fix_test.go
@@ -1576,10 +1576,9 @@
 }
 
 type testConfig struct {
-	gopathOnly             bool
-	goPackagesIncompatible bool
-	module                 packagestest.Module
-	modules                []packagestest.Module
+	gopathOnly bool
+	module     packagestest.Module
+	modules    []packagestest.Module
 }
 
 // fm is the type for a packagestest.Module's Files, abbreviated for shorter lines.
@@ -1592,37 +1591,12 @@
 		c.modules = []packagestest.Module{c.module}
 	}
 
-	var kinds []string
 	for _, exporter := range packagestest.All {
-		kinds = append(kinds, exporter.Name())
-		kinds = append(kinds, exporter.Name()+"_GoPackages")
-	}
-	for _, kind := range kinds {
-		t.Run(kind, func(t *testing.T) {
+		t.Run(exporter.Name(), func(t *testing.T) {
 			t.Helper()
-
-			forceGoPackages := false
-			var exporter packagestest.Exporter
-			if c.gopathOnly && strings.HasPrefix(kind, "Modules") {
+			if c.gopathOnly && exporter.Name() == "Modules" {
 				t.Skip("test marked GOPATH-only")
 			}
-			if c.goPackagesIncompatible && strings.HasSuffix(kind, "_GoPackages") {
-				t.Skip("test marked go/packages-incompatible")
-			}
-			switch kind {
-			case "GOPATH":
-				exporter = packagestest.GOPATH
-			case "GOPATH_GoPackages":
-				exporter = packagestest.GOPATH
-				forceGoPackages = true
-			case "Modules":
-				exporter = packagestest.Modules
-			case "Modules_GoPackages":
-				exporter = packagestest.Modules
-				forceGoPackages = true
-			default:
-				panic("unknown test type")
-			}
 			exported := packagestest.Export(t, exporter, c.modules)
 			defer exported.Cleanup()
 
@@ -1636,14 +1610,13 @@
 			it := &goimportTest{
 				T: t,
 				env: &ProcessEnv{
-					GOROOT:          env["GOROOT"],
-					GOPATH:          env["GOPATH"],
-					GO111MODULE:     env["GO111MODULE"],
-					GOSUMDB:         env["GOSUMDB"],
-					WorkingDir:      exported.Config.Dir,
-					ForceGoPackages: forceGoPackages,
-					Debug:           *testDebug,
-					Logf:            log.Printf,
+					GOROOT:      env["GOROOT"],
+					GOPATH:      env["GOPATH"],
+					GO111MODULE: env["GO111MODULE"],
+					GOSUMDB:     env["GOSUMDB"],
+					WorkingDir:  exported.Config.Dir,
+					Debug:       *testDebug,
+					Logf:        log.Printf,
 				},
 				exported: exported,
 			}
@@ -2459,7 +2432,6 @@
 var _ = &bytes.Buffer{}
 `
 	testConfig{
-		goPackagesIncompatible: true,
 		module: packagestest.Module{
 			Name: "mycompany.net",
 		},
@@ -2540,7 +2512,6 @@
 				Files: fm{"bar/bar.go": "package bar\n"},
 			},
 		},
-		goPackagesIncompatible: true, // getAllCandidates doesn't support the go/packages resolver.
 	}.test(t, func(t *goimportTest) {
 		candidates, err := getAllCandidates("x.go", t.env)
 		if err != nil {
@@ -2577,7 +2548,6 @@
 				Files: fm{"rand/bar.go": "package rand\nvar Bar int\n"},
 			},
 		},
-		goPackagesIncompatible: true, // getPackageCompletions doesn't support the go/packages resolver.
 	}.test(t, func(t *goimportTest) {
 		candidates, err := getPackageExports("rand", "x.go", t.env)
 		if err != nil {
