diff --git a/gosumcheck/main.go b/gosumcheck/main.go
index c1d8fc2..668b46c 100644
--- a/gosumcheck/main.go
+++ b/gosumcheck/main.go
@@ -34,7 +34,6 @@
 	"flag"
 	"fmt"
 	"io"
-	"io/ioutil"
 	"log"
 	"net/http"
 	"os"
@@ -84,7 +83,7 @@
 	client.SetGONOSUMDB(env)
 
 	for _, arg := range flag.Args() {
-		data, err := ioutil.ReadFile(arg)
+		data, err := os.ReadFile(arg)
 		if err != nil {
 			log.Fatal(err)
 		}
@@ -201,7 +200,7 @@
 	if resp.StatusCode != 200 {
 		return nil, fmt.Errorf("GET %v: %v", target, resp.Status)
 	}
-	data, err := ioutil.ReadAll(io.LimitReader(resp.Body, 1<<20))
+	data, err := io.ReadAll(io.LimitReader(resp.Body, 1<<20))
 	if err != nil {
 		return nil, err
 	}
diff --git a/modfile/read_test.go b/modfile/read_test.go
index e43f693..82c778d 100644
--- a/modfile/read_test.go
+++ b/modfile/read_test.go
@@ -7,7 +7,6 @@
 import (
 	"bytes"
 	"fmt"
-	"io/ioutil"
 	"os"
 	"os/exec"
 	"path/filepath"
@@ -43,13 +42,13 @@
 // It reads the file named in, reformats it, and compares
 // the result to the file named out.
 func testPrint(t *testing.T, in, out string) {
-	data, err := ioutil.ReadFile(in)
+	data, err := os.ReadFile(in)
 	if err != nil {
 		t.Error(err)
 		return
 	}
 
-	golden, err := ioutil.ReadFile(out)
+	golden, err := os.ReadFile(out)
 	if err != nil {
 		t.Error(err)
 		return
@@ -157,7 +156,7 @@
 		}
 		t.Run(name, func(t *testing.T) {
 			t.Parallel()
-			data, err := ioutil.ReadFile(out)
+			data, err := os.ReadFile(out)
 			if err != nil {
 				t.Fatal(err)
 			}
@@ -212,7 +211,7 @@
 			}
 
 			if strings.HasSuffix(out, ".in") {
-				golden, err := ioutil.ReadFile(strings.TrimSuffix(out, ".in") + ".golden")
+				golden, err := os.ReadFile(strings.TrimSuffix(out, ".in") + ".golden")
 				if err != nil {
 					t.Fatal(err)
 				}
@@ -346,14 +345,14 @@
 
 // diff returns the output of running diff on b1 and b2.
 func diff(b1, b2 []byte) (data []byte, err error) {
-	f1, err := ioutil.TempFile("", "testdiff")
+	f1, err := os.CreateTemp("", "testdiff")
 	if err != nil {
 		return nil, err
 	}
 	defer os.Remove(f1.Name())
 	defer f1.Close()
 
-	f2, err := ioutil.TempFile("", "testdiff")
+	f2, err := os.CreateTemp("", "testdiff")
 	if err != nil {
 		return nil, err
 	}
diff --git a/modfile/work_test.go b/modfile/work_test.go
index 332df97..46115a5 100644
--- a/modfile/work_test.go
+++ b/modfile/work_test.go
@@ -6,7 +6,7 @@
 
 import (
 	"bytes"
-	"io/ioutil"
+	"os"
 	"path/filepath"
 	"strings"
 	"testing"
@@ -308,7 +308,7 @@
 		name := filepath.Base(out)
 		t.Run(name, func(t *testing.T) {
 			t.Parallel()
-			data, err := ioutil.ReadFile(out)
+			data, err := os.ReadFile(out)
 			if err != nil {
 				t.Fatal(err)
 			}
@@ -360,7 +360,7 @@
 			}
 
 			if strings.HasSuffix(out, ".in") {
-				golden, err := ioutil.ReadFile(strings.TrimSuffix(out, ".in") + ".golden")
+				golden, err := os.ReadFile(strings.TrimSuffix(out, ".in") + ".golden")
 				if err != nil {
 					t.Fatal(err)
 				}
diff --git a/sumdb/dirhash/hash_test.go b/sumdb/dirhash/hash_test.go
index f3c504d..08beb85 100644
--- a/sumdb/dirhash/hash_test.go
+++ b/sumdb/dirhash/hash_test.go
@@ -10,7 +10,6 @@
 	"encoding/base64"
 	"fmt"
 	"io"
-	"io/ioutil"
 	"os"
 	"path/filepath"
 	"strings"
@@ -29,7 +28,7 @@
 func TestHash1(t *testing.T) {
 	files := []string{"xyz", "abc"}
 	open := func(name string) (io.ReadCloser, error) {
-		return ioutil.NopCloser(strings.NewReader("data for " + name)), nil
+		return io.NopCloser(strings.NewReader("data for " + name)), nil
 	}
 	want := htop("h1", fmt.Sprintf("%s  %s\n%s  %s\n", h("data for abc"), "abc", h("data for xyz"), "xyz"))
 	out, err := Hash1(files, open)
@@ -47,15 +46,11 @@
 }
 
 func TestHashDir(t *testing.T) {
-	dir, err := ioutil.TempDir("", "dirhash-test-")
-	if err != nil {
+	dir := t.TempDir()
+	if err := os.WriteFile(filepath.Join(dir, "xyz"), []byte("data for xyz"), 0666); err != nil {
 		t.Fatal(err)
 	}
-	defer os.RemoveAll(dir)
-	if err := ioutil.WriteFile(filepath.Join(dir, "xyz"), []byte("data for xyz"), 0666); err != nil {
-		t.Fatal(err)
-	}
-	if err := ioutil.WriteFile(filepath.Join(dir, "abc"), []byte("data for abc"), 0666); err != nil {
+	if err := os.WriteFile(filepath.Join(dir, "abc"), []byte("data for abc"), 0666); err != nil {
 		t.Fatal(err)
 	}
 	want := htop("h1", fmt.Sprintf("%s  %s\n%s  %s\n", h("data for abc"), "prefix/abc", h("data for xyz"), "prefix/xyz"))
@@ -69,11 +64,10 @@
 }
 
 func TestHashZip(t *testing.T) {
-	f, err := ioutil.TempFile("", "dirhash-test-")
+	f, err := os.CreateTemp(t.TempDir(), "dirhash-test-")
 	if err != nil {
 		t.Fatal(err)
 	}
-	defer os.Remove(f.Name())
 	defer f.Close()
 
 	z := zip.NewWriter(f)
@@ -106,21 +100,17 @@
 
 func TestDirFiles(t *testing.T) {
 	t.Run("valid directory with files", func(t *testing.T) {
-		dir, err := ioutil.TempDir("", "dirfiles-test-")
-		if err != nil {
+		dir := t.TempDir()
+		if err := os.WriteFile(filepath.Join(dir, "xyz"), []byte("data for xyz"), 0666); err != nil {
 			t.Fatal(err)
 		}
-		defer os.RemoveAll(dir)
-		if err := ioutil.WriteFile(filepath.Join(dir, "xyz"), []byte("data for xyz"), 0666); err != nil {
-			t.Fatal(err)
-		}
-		if err := ioutil.WriteFile(filepath.Join(dir, "abc"), []byte("data for abc"), 0666); err != nil {
+		if err := os.WriteFile(filepath.Join(dir, "abc"), []byte("data for abc"), 0666); err != nil {
 			t.Fatal(err)
 		}
 		if err := os.Mkdir(filepath.Join(dir, "subdir"), 0777); err != nil {
 			t.Fatal(err)
 		}
-		if err := ioutil.WriteFile(filepath.Join(dir, "subdir", "xyz"), []byte("data for subdir xyz"), 0666); err != nil {
+		if err := os.WriteFile(filepath.Join(dir, "subdir", "xyz"), []byte("data for subdir xyz"), 0666); err != nil {
 			t.Fatal(err)
 		}
 		prefix := "foo/bar@v2.3.4"
diff --git a/sumdb/tlog/ct_test.go b/sumdb/tlog/ct_test.go
index c2d9aeb..f8c364b 100644
--- a/sumdb/tlog/ct_test.go
+++ b/sumdb/tlog/ct_test.go
@@ -7,7 +7,7 @@
 import (
 	"encoding/json"
 	"fmt"
-	"io/ioutil"
+	"io"
 	"net/http"
 	"net/url"
 	"os"
@@ -80,7 +80,7 @@
 		t.Fatal(err)
 	}
 	defer resp.Body.Close()
-	data, err := ioutil.ReadAll(resp.Body)
+	data, err := io.ReadAll(resp.Body)
 	if err != nil {
 		t.Fatal(err)
 	}
diff --git a/zip/zip.go b/zip/zip.go
index 0328705..c5eca4b 100644
--- a/zip/zip.go
+++ b/zip/zip.go
@@ -51,7 +51,6 @@
 	"errors"
 	"fmt"
 	"io"
-	"io/ioutil"
 	"os"
 	"os/exec"
 	"path"
@@ -753,7 +752,7 @@
 
 	// Check that the directory is empty. Don't create it yet in case there's
 	// an error reading the zip.
-	if files, _ := ioutil.ReadDir(dir); len(files) > 0 {
+	if files, _ := os.ReadDir(dir); len(files) > 0 {
 		return fmt.Errorf("target directory %v exists and is not empty", dir)
 	}
 
diff --git a/zip/zip_test.go b/zip/zip_test.go
index 89d5555..84a3ecd 100644
--- a/zip/zip_test.go
+++ b/zip/zip_test.go
@@ -12,7 +12,6 @@
 	"errors"
 	"fmt"
 	"io"
-	"io/ioutil"
 	"os"
 	"os/exec"
 	"path"
@@ -128,7 +127,7 @@
 		if err := os.MkdirAll(filepath.Dir(filePath), 0777); err != nil {
 			return "", err
 		}
-		if err := ioutil.WriteFile(filePath, f.Data, 0666); err != nil {
+		if err := os.WriteFile(filePath, f.Data, 0666); err != nil {
 			return "", err
 		}
 	}
@@ -174,12 +173,12 @@
 func (f fakeFile) Lstat() (os.FileInfo, error) { return fakeFileInfo{f}, nil }
 func (f fakeFile) Open() (io.ReadCloser, error) {
 	if f.data != nil {
-		return ioutil.NopCloser(bytes.NewReader(f.data)), nil
+		return io.NopCloser(bytes.NewReader(f.data)), nil
 	}
 	if f.size >= uint64(modzip.MaxZipFile<<1) {
 		return nil, fmt.Errorf("cannot open fakeFile of size %d", f.size)
 	}
-	return ioutil.NopCloser(io.LimitReader(zeroReader{}, int64(f.size))), nil
+	return io.NopCloser(io.LimitReader(zeroReader{}, int64(f.size))), nil
 }
 
 type fakeFileInfo struct {
@@ -399,13 +398,13 @@
 
 func TestCreate(t *testing.T) {
 	testDir := filepath.FromSlash("testdata/create")
-	testInfos, err := ioutil.ReadDir(testDir)
+	testEntries, err := os.ReadDir(testDir)
 	if err != nil {
 		t.Fatal(err)
 	}
-	for _, testInfo := range testInfos {
-		testInfo := testInfo
-		base := filepath.Base(testInfo.Name())
+	for _, testEntry := range testEntries {
+		testEntry := testEntry
+		base := filepath.Base(testEntry.Name())
 		if filepath.Ext(base) != ".txt" {
 			continue
 		}
@@ -413,22 +412,19 @@
 			t.Parallel()
 
 			// Load the test.
-			testPath := filepath.Join(testDir, testInfo.Name())
+			testPath := filepath.Join(testDir, testEntry.Name())
 			test, err := readTest(testPath)
 			if err != nil {
 				t.Fatal(err)
 			}
 
 			// Write zip to temporary file.
-			tmpZip, err := ioutil.TempFile("", "TestCreate-*.zip")
+			tmpZip, err := os.CreateTemp(t.TempDir(), "TestCreate-*.zip")
 			if err != nil {
 				t.Fatal(err)
 			}
 			tmpZipPath := tmpZip.Name()
-			defer func() {
-				tmpZip.Close()
-				os.Remove(tmpZipPath)
-			}()
+			defer tmpZip.Close()
 			m := module.Version{Path: test.path, Version: test.version}
 			files := make([]modzip.File, len(test.archive.Files))
 			for i, tf := range test.archive.Files {
@@ -465,13 +461,13 @@
 
 func TestCreateFromDir(t *testing.T) {
 	testDir := filepath.FromSlash("testdata/create_from_dir")
-	testInfos, err := ioutil.ReadDir(testDir)
+	testEntries, err := os.ReadDir(testDir)
 	if err != nil {
 		t.Fatal(err)
 	}
-	for _, testInfo := range testInfos {
-		testInfo := testInfo
-		base := filepath.Base(testInfo.Name())
+	for _, testEntry := range testEntries {
+		testEntry := testEntry
+		base := filepath.Base(testEntry.Name())
 		if filepath.Ext(base) != ".txt" {
 			continue
 		}
@@ -479,7 +475,7 @@
 			t.Parallel()
 
 			// Load the test.
-			testPath := filepath.Join(testDir, testInfo.Name())
+			testPath := filepath.Join(testDir, testEntry.Name())
 			test, err := readTest(testPath)
 			if err != nil {
 				t.Fatal(err)
@@ -492,15 +488,12 @@
 			}
 
 			// Create zip from the directory.
-			tmpZip, err := ioutil.TempFile("", "TestCreateFromDir-*.zip")
+			tmpZip, err := os.CreateTemp(t.TempDir(), "TestCreateFromDir-*.zip")
 			if err != nil {
 				t.Fatal(err)
 			}
 			tmpZipPath := tmpZip.Name()
-			defer func() {
-				tmpZip.Close()
-				os.Remove(tmpZipPath)
-			}()
+			defer tmpZip.Close()
 			m := module.Version{Path: test.path, Version: test.version}
 			if err := modzip.CreateFromDir(tmpZip, m, tmpDir); err != nil {
 				if test.wantErr == "" {
@@ -561,7 +554,7 @@
 					t.Fatal(err)
 				}
 				goModData := []byte("module example.com/m\n\ngo 1.13\n")
-				if err := ioutil.WriteFile(filepath.Join(vendorDir, "go.mod"), goModData, 0666); err != nil {
+				if err := os.WriteFile(filepath.Join(vendorDir, "go.mod"), goModData, 0666); err != nil {
 					t.Fatal(err)
 				}
 				return vendorDir
@@ -570,22 +563,14 @@
 		},
 	} {
 		t.Run(test.desc, func(t *testing.T) {
-			tmpDir, err := ioutil.TempDir("", "TestCreateFromDirSpecial-"+test.desc)
-			if err != nil {
-				t.Fatal(err)
-			}
-			defer os.RemoveAll(tmpDir)
-			dir := test.setup(t, tmpDir)
+			dir := test.setup(t, t.TempDir())
 
-			tmpZipFile, err := ioutil.TempFile("", "TestCreateFromDir-*.zip")
+			tmpZipFile, err := os.CreateTemp(t.TempDir(), "TestCreateFromDir-*.zip")
 			if err != nil {
 				t.Fatal(err)
 			}
 			tmpZipPath := tmpZipFile.Name()
-			defer func() {
-				tmpZipFile.Close()
-				os.Remove(tmpZipPath)
-			}()
+			defer tmpZipFile.Close()
 
 			m := module.Version{Path: "example.com/m", Version: "v1.0.0"}
 			if err := modzip.CreateFromDir(tmpZipFile, m, dir); err != nil {
@@ -606,18 +591,18 @@
 
 func TestUnzip(t *testing.T) {
 	testDir := filepath.FromSlash("testdata/unzip")
-	testInfos, err := ioutil.ReadDir(testDir)
+	testEntries, err := os.ReadDir(testDir)
 	if err != nil {
 		t.Fatal(err)
 	}
-	for _, testInfo := range testInfos {
-		base := filepath.Base(testInfo.Name())
+	for _, testEntry := range testEntries {
+		base := filepath.Base(testEntry.Name())
 		if filepath.Ext(base) != ".txt" {
 			continue
 		}
 		t.Run(base[:len(base)-len(".txt")], func(t *testing.T) {
 			// Load the test.
-			testPath := filepath.Join(testDir, testInfo.Name())
+			testPath := filepath.Join(testDir, testEntry.Name())
 			test, err := readTest(testPath)
 			if err != nil {
 				t.Fatal(err)
@@ -630,11 +615,7 @@
 			}
 
 			// Extract to a temporary directory.
-			tmpDir, err := ioutil.TempDir("", "TestUnzip")
-			if err != nil {
-				t.Fatal(err)
-			}
-			defer os.RemoveAll(tmpDir)
+			tmpDir := t.TempDir()
 			m := module.Version{Path: test.path, Version: test.version}
 			if err := modzip.Unzip(tmpDir, m, tmpZipPath); err != nil {
 				if test.wantErr == "" {
@@ -790,7 +771,7 @@
 			if wantCreateErr == "" {
 				wantCreateErr = test.wantErr
 			}
-			if err := modzip.Create(ioutil.Discard, sizeLimitVersion, test.files); err == nil && wantCreateErr != "" {
+			if err := modzip.Create(io.Discard, sizeLimitVersion, test.files); err == nil && wantCreateErr != "" {
 				t.Fatalf("Create: unexpected success; want error containing %q", wantCreateErr)
 			} else if err != nil && wantCreateErr == "" {
 				t.Fatalf("Create: got error %q; want success", err)
@@ -809,17 +790,12 @@
 		test := test
 		t.Run(test.desc, func(t *testing.T) {
 			t.Parallel()
-			tmpZipFile, err := ioutil.TempFile("", "TestUnzipSizeLimits-*.zip")
+			tmpZipFile, err := os.CreateTemp(t.TempDir(), "TestUnzipSizeLimits-*.zip")
 			if err != nil {
 				t.Fatal(err)
 			}
 			tmpZipPath := tmpZipFile.Name()
-			defer func() {
-				tmpZipFile.Close()
-				if err := os.Remove(tmpZipPath); err != nil {
-					t.Errorf("removing temp zip file: %v", err)
-				}
-			}()
+			defer tmpZipFile.Close()
 
 			zw := zip.NewWriter(tmpZipFile)
 			prefix := fmt.Sprintf("%s@%s/", sizeLimitVersion.Path, sizeLimitVersion.Version)
@@ -845,16 +821,6 @@
 				t.Fatal(err)
 			}
 
-			tmpDir, err := ioutil.TempDir("", "TestUnzipSizeLimits")
-			if err != nil {
-				t.Fatal(err)
-			}
-			defer func() {
-				if err := os.RemoveAll(tmpDir); err != nil {
-					t.Errorf("removing temp dir: %v", err)
-				}
-			}()
-
 			wantCheckZipErr := test.wantCheckZipErr
 			if wantCheckZipErr == "" {
 				wantCheckZipErr = test.wantErr
@@ -875,7 +841,7 @@
 			if wantUnzipErr == "" {
 				wantUnzipErr = test.wantErr
 			}
-			if err := modzip.Unzip(tmpDir, sizeLimitVersion, tmpZipPath); err == nil && wantUnzipErr != "" {
+			if err := modzip.Unzip(t.TempDir(), sizeLimitVersion, tmpZipPath); err == nil && wantUnzipErr != "" {
 				t.Fatalf("Unzip: unexpected success; want error containing %q", wantUnzipErr)
 			} else if err != nil && wantUnzipErr == "" {
 				t.Fatalf("Unzip: got error %q; want success", err)
@@ -975,27 +941,18 @@
 		test := test
 		t.Run(test.desc, func(t *testing.T) {
 			t.Parallel()
-			tmpZipFile, err := ioutil.TempFile("", "TestUnzipSizeLimitsSpecial-*.zip")
+			tmpZipFile, err := os.CreateTemp(t.TempDir(), "TestUnzipSizeLimitsSpecial-*.zip")
 			if err != nil {
 				t.Fatal(err)
 			}
 			tmpZipPath := tmpZipFile.Name()
-			defer func() {
-				tmpZipFile.Close()
-				os.Remove(tmpZipPath)
-			}()
+			defer tmpZipFile.Close()
 
 			test.writeZip(t, tmpZipFile)
 			if err := tmpZipFile.Close(); err != nil {
 				t.Fatal(err)
 			}
 
-			tmpDir, err := ioutil.TempDir("", "TestUnzipSizeLimitsSpecial")
-			if err != nil {
-				t.Fatal(err)
-			}
-			defer os.RemoveAll(tmpDir)
-
 			want := func() string {
 				s := fmt.Sprintf("%q", test.wantErr1)
 				if test.wantErr2 != "" {
@@ -1004,7 +961,7 @@
 				return s
 			}
 
-			if err := modzip.Unzip(tmpDir, test.m, tmpZipPath); err == nil && test.wantErr1 != "" {
+			if err := modzip.Unzip(t.TempDir(), test.m, tmpZipPath); err == nil && test.wantErr1 != "" {
 				t.Fatalf("unexpected success; want error containing %s", want())
 			} else if err != nil && test.wantErr1 == "" {
 				t.Fatalf("got error %q; want success", err)
@@ -1328,15 +1285,12 @@
 				})
 			}
 
-			tmpModZipFile, err := ioutil.TempFile("", "TestVCS-*.zip")
+			tmpModZipFile, err := os.CreateTemp(t.TempDir(), "TestVCS-*.zip")
 			if err != nil {
 				t.Fatal(err)
 			}
 			tmpModZipPath := tmpModZipFile.Name()
-			defer func() {
-				tmpModZipFile.Close()
-				os.Remove(tmpModZipPath)
-			}()
+			defer tmpModZipFile.Close()
 			h := sha256.New()
 			w := io.MultiWriter(tmpModZipFile, h)
 			if err := modzip.Create(w, test.m, files); err != nil {
@@ -1401,8 +1355,7 @@
 		}
 
 		// Create an archive.
-		zipPath := filepath.Join(t.TempDir(), "vcs.zip")
-		tmpZipFile, err := os.Create(zipPath)
+		tmpZipFile, err := os.CreateTemp(t.TempDir(), "downloadVCSZip-*.zip")
 		if err != nil {
 			return "", nil, err
 		}
@@ -1442,13 +1395,12 @@
 		}
 
 		// Create an archive.
-		tmpZipFile, err := ioutil.TempFile("", "downloadVCSZip-*.zip")
+		tmpZipFile, err := os.CreateTemp(t.TempDir(), "downloadVCSZip-*.zip")
 		if err != nil {
 			return "", nil, err
 		}
 		tmpZipPath := tmpZipFile.Name()
 		tmpZipFile.Close()
-		t.Cleanup(func() { os.Remove(tmpZipPath) })
 		args := []string{"archive", "-t", "zip", "--no-decode", "-r", rev, "--prefix=prefix/"}
 		if subdir != "" {
 			args = append(args, "-I", subdir+"/**")
@@ -1702,15 +1654,11 @@
 	}
 
 	// Create zip from the directory.
-	tmpZip, err := ioutil.TempFile("", "TestCreateFromDir-*.zip")
+	tmpZip, err := os.CreateTemp(t.TempDir(), "TestCreateFromDir-*.zip")
 	if err != nil {
 		t.Fatal(err)
 	}
-	tmpZipPath := tmpZip.Name()
-	defer func() {
-		tmpZip.Close()
-		os.Remove(tmpZipPath)
-	}()
+	defer tmpZip.Close()
 
 	m := module.Version{Path: "example.com/foo/bar", Version: "v0.0.1"}
 
@@ -1746,15 +1694,11 @@
 	gitInit(t, tmpDir)
 
 	// Create zip from the directory.
-	tmpZip, err := ioutil.TempFile("", "TestCreateFromDir-*.zip")
+	tmpZip, err := os.CreateTemp(t.TempDir(), "TestCreateFromDir-*.zip")
 	if err != nil {
 		t.Fatal(err)
 	}
-	tmpZipPath := tmpZip.Name()
-	defer func() {
-		tmpZip.Close()
-		os.Remove(tmpZipPath)
-	}()
+	defer tmpZip.Close()
 
 	m := module.Version{Path: "example.com/foo/bar", Version: "v0.0.1"}
 
