diff --git a/internal/scan/flags.go b/internal/scan/flags.go
index 0453bd7..482620f 100644
--- a/internal/scan/flags.go
+++ b/internal/scan/flags.go
@@ -23,16 +23,16 @@
 	dir      string
 	tags     buildutil.TagsFlag
 	test     bool
-	show     showFlag
-	format   formatFlag
+	show     ShowFlag
+	format   FormatFlag
 	env      []string
 }
 
 func parseFlags(cfg *config, stderr io.Writer, args []string) error {
 	var version bool
 	var json bool
-	var scanFlag scanFlag
-	var modeFlag modeFlag
+	var scanFlag ScanFlag
+	var modeFlag ModeFlag
 	flags := flag.NewFlagSet("", flag.ContinueOnError)
 	flags.SetOutput(stderr)
 	flags.BoolVar(&json, "json", false, "output JSON (Go compatible legacy flag, see format flag)")
@@ -187,9 +187,9 @@
 
 var errFlagParse = errors.New("see -help for details")
 
-// showFlag is used for parsing and validation of
+// ShowFlag is used for parsing and validation of
 // govulncheck -show flag.
-type showFlag []string
+type ShowFlag []string
 
 var supportedShows = map[string]bool{
 	"traces":  true,
@@ -198,7 +198,7 @@
 	"version": true,
 }
 
-func (v *showFlag) Set(s string) error {
+func (v *ShowFlag) Set(s string) error {
 	if s == "" {
 		return nil
 	}
@@ -212,12 +212,28 @@
 	return nil
 }
 
-func (f *showFlag) Get() interface{} { return *f }
-func (f *showFlag) String() string   { return "" }
+func (v *ShowFlag) Get() interface{} { return *v }
+func (v *ShowFlag) String() string   { return "" }
 
-// formatFlag is used for parsing and validation of
+// Update the text handler h with values of the flag.
+func (v ShowFlag) Update(h *TextHandler) {
+	for _, show := range v {
+		switch show {
+		case "traces":
+			h.showTraces = true
+		case "color":
+			h.showColor = true
+		case "version":
+			h.showVersion = true
+		case "verbose":
+			h.showVerbose = true
+		}
+	}
+}
+
+// FormatFlag is used for parsing and validation of
 // govulncheck -format flag.
-type formatFlag string
+type FormatFlag string
 
 const (
 	formatUnset = ""
@@ -232,19 +248,19 @@
 	formatSarif: true,
 }
 
-func (f *formatFlag) Get() interface{} { return *f }
-func (f *formatFlag) Set(s string) error {
+func (f *FormatFlag) Get() interface{} { return *f }
+func (f *FormatFlag) Set(s string) error {
 	if _, ok := supportedFormats[s]; !ok {
 		return errFlagParse
 	}
-	*f = formatFlag(s)
+	*f = FormatFlag(s)
 	return nil
 }
-func (f *formatFlag) String() string { return "" }
+func (f *FormatFlag) String() string { return "" }
 
-// modeFlag is used for parsing and validation of
+// ModeFlag is used for parsing and validation of
 // govulncheck -mode flag.
-type modeFlag string
+type ModeFlag string
 
 var supportedModes = map[string]bool{
 	govulncheck.ScanModeSource:  true,
@@ -254,19 +270,19 @@
 	govulncheck.ScanModeExtract: true,
 }
 
-func (f *modeFlag) Get() interface{} { return *f }
-func (f *modeFlag) Set(s string) error {
+func (f *ModeFlag) Get() interface{} { return *f }
+func (f *ModeFlag) Set(s string) error {
 	if _, ok := supportedModes[s]; !ok {
 		return errFlagParse
 	}
-	*f = modeFlag(s)
+	*f = ModeFlag(s)
 	return nil
 }
-func (f *modeFlag) String() string { return "" }
+func (f *ModeFlag) String() string { return "" }
 
-// scanFlag is used for parsing and validation of
+// ScanFlag is used for parsing and validation of
 // govulncheck -scan flag.
-type scanFlag string
+type ScanFlag string
 
 var supportedLevels = map[string]bool{
 	govulncheck.ScanLevelModule:  true,
@@ -274,12 +290,12 @@
 	govulncheck.ScanLevelSymbol:  true,
 }
 
-func (f *scanFlag) Get() interface{} { return *f }
-func (f *scanFlag) Set(s string) error {
+func (f *ScanFlag) Get() interface{} { return *f }
+func (f *ScanFlag) Set(s string) error {
 	if _, ok := supportedLevels[s]; !ok {
 		return errFlagParse
 	}
-	*f = scanFlag(s)
+	*f = ScanFlag(s)
 	return nil
 }
-func (f *scanFlag) String() string { return "" }
+func (f *ScanFlag) String() string { return "" }
diff --git a/internal/scan/print_test.go b/internal/scan/print_test.go
index 6fd211a..84492ed 100644
--- a/internal/scan/print_test.go
+++ b/internal/scan/print_test.go
@@ -38,7 +38,7 @@
 				wantText, _ := fs.ReadFile(testdata, textfile)
 				got := &bytes.Buffer{}
 				handler := scan.NewTextHandler(got)
-				handler.Show(strings.Split(textname, "_")[1:])
+				scan.ShowFlag(strings.Split(textname, "_")[1:]).Update(handler)
 				testRunHandler(t, rawJSON, handler)
 				if diff := cmp.Diff(string(wantText), got.String()); diff != "" {
 					if *update {
diff --git a/internal/scan/run.go b/internal/scan/run.go
index e6f8fee..c59a136 100644
--- a/internal/scan/run.go
+++ b/internal/scan/run.go
@@ -43,7 +43,7 @@
 		handler = sarif.NewHandler(stdout)
 	default:
 		th := NewTextHandler(stdout)
-		th.Show(cfg.show)
+		cfg.show.Update(th)
 		handler = th
 	}
 
diff --git a/internal/scan/text.go b/internal/scan/text.go
index 58dcd8d..16ab6b5 100644
--- a/internal/scan/text.go
+++ b/internal/scan/text.go
@@ -41,10 +41,10 @@
 
 	err error
 
-	showColor    bool
-	showTraces   bool
-	showVersion  bool
-	showAllVulns bool
+	showColor   bool
+	showTraces  bool
+	showVersion bool
+	showVerbose bool
 }
 
 const (
@@ -61,21 +61,6 @@
 	symbolMessage = `'-scan symbol' for more fine grained vulnerability detection`
 )
 
-func (h *TextHandler) Show(show []string) {
-	for _, show := range show {
-		switch show {
-		case "traces":
-			h.showTraces = true
-		case "color":
-			h.showColor = true
-		case "version":
-			h.showVersion = true
-		case "verbose":
-			h.showAllVulns = true
-		}
-	}
-}
-
 func (h *TextHandler) Flush() error {
 	if len(h.findings) == 0 {
 		h.print(noVulnsMessage + "\n")
@@ -181,7 +166,7 @@
 		}
 	}
 
-	if h.scanLevel == govulncheck.ScanLevelPackage || (h.scanLevel.WantPackages() && h.showAllVulns) {
+	if h.scanLevel == govulncheck.ScanLevelPackage || (h.scanLevel.WantPackages() && h.showVerbose) {
 		h.style(sectionStyle, "=== Package Results ===\n\n")
 		if len(imported) == 0 {
 			h.print(choose(!h.scanLevel.WantSymbols(), noVulnsMessage, noOtherVulnsMessage), "\n\n")
@@ -191,7 +176,7 @@
 		}
 	}
 
-	if h.showAllVulns || h.scanLevel == govulncheck.ScanLevelModule {
+	if h.showVerbose || h.scanLevel == govulncheck.ScanLevelModule {
 		h.style(sectionStyle, "=== Module Results ===\n\n")
 		if len(required) == 0 {
 			h.print(choose(!h.scanLevel.WantPackages(), noVulnsMessage, noOtherVulnsMessage), "\n\n")
@@ -409,12 +394,12 @@
 	var sugg strings.Builder
 	switch h.scanLevel {
 	case govulncheck.ScanLevelSymbol:
-		if !h.showAllVulns {
+		if !h.showVerbose {
 			sugg.WriteString("Use " + verboseMessage + ".")
 		}
 	case govulncheck.ScanLevelPackage:
 		sugg.WriteString("Use " + symbolMessage)
-		if !h.showAllVulns {
+		if !h.showVerbose {
 			sugg.WriteString(" and " + verboseMessage)
 		}
 		sugg.WriteString(".")
