diff --git a/vendor/cmd/go/internal/modcmd/mod.go b/vendor/cmd/go/internal/modcmd/mod.go
index f8b36d4..194ba02 100644
--- a/vendor/cmd/go/internal/modcmd/mod.go
+++ b/vendor/cmd/go/internal/modcmd/mod.go
@@ -261,7 +261,7 @@
 	}
 
 	if *modVerify {
-		panic("TODO: move runVerify over")
+		runVerify()
 	}
 }
 
diff --git a/vendor/cmd/go/internal/vgo/verify.go b/vendor/cmd/go/internal/modcmd/verify.go
similarity index 60%
rename from vendor/cmd/go/internal/vgo/verify.go
rename to vendor/cmd/go/internal/modcmd/verify.go
index 0938092..60a9871 100644
--- a/vendor/cmd/go/internal/vgo/verify.go
+++ b/vendor/cmd/go/internal/modcmd/verify.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-package vgo
+package modcmd
 
 import (
 	"bytes"
@@ -14,40 +14,12 @@
 	"cmd/go/internal/base"
 	"cmd/go/internal/dirhash"
 	"cmd/go/internal/module"
+	"cmd/go/internal/vgo"
 )
 
-var CmdVerify = &base.Command{
-	UsageLine: "verify",
-	Run:       runVerify,
-	Short:     "verify downloaded modules against expected hashes",
-	Long: `
-Verify checks that the dependencies of the current module,
-which are stored in a local downloaded source cache,
-have not been modified since being downloaded.
-
-If all the modules are unmodified, verify prints
-
-	all modules verified
-
-and exits successfully (status 0). Otherwise, verify reports
-which modules have been changed and exits with a non-zero status.
-	`,
-}
-
-func runVerify(cmd *base.Command, args []string) {
-	if Init(); !Enabled() {
-		base.Fatalf("vgo verify: cannot use outside module")
-	}
-	if len(args) != 0 {
-		// TODO: take arguments
-		base.Fatalf("vgo verify: verify takes no arguments")
-	}
-
-	// Make go.mod consistent but don't load any packages.
-	LoadBuildList()
-
+func runVerify() {
 	ok := true
-	for _, mod := range buildList[1:] {
+	for _, mod := range vgo.LoadBuildList()[1:] {
 		ok = verifyMod(mod) && ok
 	}
 	if ok {
@@ -57,9 +29,9 @@
 
 func verifyMod(mod module.Version) bool {
 	ok := true
-	zip := filepath.Join(srcV, "cache", mod.Path, "/@v/", mod.Version+".zip")
+	zip := filepath.Join(vgo.SrcV, "cache", mod.Path, "/@v/", mod.Version+".zip")
 	_, zipErr := os.Stat(zip)
-	dir := filepath.Join(srcV, mod.Path+"@"+mod.Version)
+	dir := filepath.Join(vgo.SrcV, mod.Path+"@"+mod.Version)
 	_, dirErr := os.Stat(dir)
 	data, err := ioutil.ReadFile(zip + "hash")
 	if err != nil {
diff --git a/vendor/cmd/go/internal/vgo/fetch.go b/vendor/cmd/go/internal/vgo/fetch.go
index c28353c..7cec65a 100644
--- a/vendor/cmd/go/internal/vgo/fetch.go
+++ b/vendor/cmd/go/internal/vgo/fetch.go
@@ -38,16 +38,16 @@
 	}
 
 	modpath := mod.Path + "@" + mod.Version
-	dir = filepath.Join(srcV, modpath)
+	dir = filepath.Join(SrcV, modpath)
 	if files, _ := ioutil.ReadDir(dir); len(files) == 0 {
-		zipfile := filepath.Join(srcV, "cache", mod.Path, "@v", mod.Version+".zip")
+		zipfile := filepath.Join(SrcV, "cache", mod.Path, "@v", mod.Version+".zip")
 		if _, err := os.Stat(zipfile); err == nil {
 			// Use it.
 			// This should only happen if the v/cache directory is preinitialized
 			// or if src/v/modpath was removed but not src/v/cache.
 			fmt.Fprintf(os.Stderr, "vgo: extracting %s %s\n", mod.Path, mod.Version)
 		} else {
-			if err := os.MkdirAll(filepath.Join(srcV, "cache", mod.Path, "@v"), 0777); err != nil {
+			if err := os.MkdirAll(filepath.Join(SrcV, "cache", mod.Path, "@v"), 0777); err != nil {
 				return "", err
 			}
 			fmt.Fprintf(os.Stderr, "vgo: downloading %s %s\n", mod.Path, mod.Version)
@@ -159,7 +159,7 @@
 		return
 	}
 
-	data, err := ioutil.ReadFile(filepath.Join(srcV, "cache", mod.Path, "@v", mod.Version+".ziphash"))
+	data, err := ioutil.ReadFile(filepath.Join(SrcV, "cache", mod.Path, "@v", mod.Version+".ziphash"))
 	if err != nil {
 		base.Fatalf("vgo: verifying %s %s: %v", mod.Path, mod.Version, err)
 	}
@@ -183,7 +183,7 @@
 }
 
 func findModHash(mod module.Version) string {
-	data, err := ioutil.ReadFile(filepath.Join(srcV, "cache", mod.Path, "@v", mod.Version+".ziphash"))
+	data, err := ioutil.ReadFile(filepath.Join(SrcV, "cache", mod.Path, "@v", mod.Version+".ziphash"))
 	if err != nil {
 		return ""
 	}
diff --git a/vendor/cmd/go/internal/vgo/init.go b/vendor/cmd/go/internal/vgo/init.go
index 1b6beb4..5af38cc 100644
--- a/vendor/cmd/go/internal/vgo/init.go
+++ b/vendor/cmd/go/internal/vgo/init.go
@@ -40,7 +40,7 @@
 	Target   module.Version
 
 	gopath string
-	srcV   string
+	SrcV   string // GOPATH/src/v directory where versioned cache lives
 
 	CmdModInit   bool   // go mod -init flag
 	CmdModModule string // go mod -module flag
@@ -170,8 +170,8 @@
 	if _, err := os.Stat(filepath.Join(gopath, "go.mod")); err == nil {
 		base.Fatalf("$GOPATH/go.mod exists but should not")
 	}
-	srcV = filepath.Join(list[0], "src/v")
-	codehost.WorkRoot = filepath.Join(srcV, "cache/vcswork")
+	SrcV = filepath.Join(list[0], "src/v")
+	codehost.WorkRoot = filepath.Join(SrcV, "cache/vcswork")
 
 	if CmdModInit {
 		// Running go mod -init: do legacy module conversion
diff --git a/vendor/cmd/go/internal/vgo/load.go b/vendor/cmd/go/internal/vgo/load.go
index c56838f..09dd0d5 100644
--- a/vendor/cmd/go/internal/vgo/load.go
+++ b/vendor/cmd/go/internal/vgo/load.go
@@ -63,18 +63,19 @@
 	WriteGoMod()
 }
 
-// LoadBuildList loads the build list from go.mod.
+// LoadBuildList loads and returns the build list from go.mod.
 // The loading of the build list happens automatically in ImportPaths:
 // LoadBuildList need only be called if ImportPaths is not
 // (typically in commands that care about the module but
 // no particular package).
-func LoadBuildList() {
+func LoadBuildList() []module.Version {
 	if Init(); !Enabled() {
 		base.Fatalf("vgo: LoadBuildList called but vgo not enabled")
 	}
 	InitMod()
 	iterate(func(*loader) {})
 	WriteGoMod()
+	return buildList
 }
 
 // PkgMod returns a map from package import path to the module supplying that package.
@@ -455,8 +456,8 @@
 		// TODO: return nil, fmt.Errorf("invalid semantic version %q", mod.Version)
 	}
 
-	gomod := filepath.Join(srcV, "cache", mod.Path, "@v", mod.Version+".mod")
-	infofile := filepath.Join(srcV, "cache", mod.Path, "@v", mod.Version+".info")
+	gomod := filepath.Join(SrcV, "cache", mod.Path, "@v", mod.Version+".mod")
+	infofile := filepath.Join(SrcV, "cache", mod.Path, "@v", mod.Version+".info")
 	var f *modfile.File
 	if data, err := ioutil.ReadFile(gomod); err == nil {
 		// If go.mod has a //vgo comment at the start,
diff --git a/vendor/cmd/go/main.go b/vendor/cmd/go/main.go
index d8c6b22..3f3518f 100644
--- a/vendor/cmd/go/main.go
+++ b/vendor/cmd/go/main.go
@@ -55,7 +55,6 @@
 		test.CmdTest,
 		tool.CmdTool,
 		vgo.CmdVendor,
-		vgo.CmdVerify,
 		version.CmdVersion,
 		vet.CmdVet,
 
@@ -126,14 +125,16 @@
 		os.Exit(2)
 	}
 
-	// Run vgo.Init so that each subcommand doesn't have to worry about it.
-	// Also install the vgo get command instead of the old go get command in vgo mode.
-	//
-	// If we should be vgo (if the command is named vgo or if invoked as go -vgo),
-	// and there is no go.mod file, vgo.Init will treat that as a fatal error.
-	// Normally that's fine, but if this is 'go mod -init' we need to give it a
-	// chance to create that go.mod file, so skip the init dance for 'go mod'.
-	if args[0] != "mod" {
+	switch args[0] {
+	case "verify":
+		fmt.Fprintf(os.Stderr, "go verify is now go mod -verify\n")
+		os.Exit(2)
+	case "mod":
+		// Skip vgo.Init (which may insist on go.mod existing)
+		// so that go mod -init has a chance to write the file.
+	default:
+		// Run vgo.Init so that each subcommand doesn't have to worry about it.
+		// Also install the vgo get command instead of the old go get command in vgo mode.
 		vgo.Init()
 		if !vgo.MustBeVgo && vgo.Enabled() {
 			// Didn't do this above, so do it now.
