diff --git a/vulncheck/binary.go b/vulncheck/binary.go
index 2add537..0d1d331 100644
--- a/vulncheck/binary.go
+++ b/vulncheck/binary.go
@@ -31,7 +31,7 @@
 	if err != nil {
 		return nil, err
 	}
-	modVulns = modVulns.Filter(lookupEnv("GOOS", runtime.GOOS), lookupEnv("GOARCH", runtime.GOARCH))
+	modVulns = modVulns.filter(lookupEnv("GOOS", runtime.GOOS), lookupEnv("GOARCH", runtime.GOARCH))
 	result := &Result{}
 	for pkg, symbols := range packageSymbols {
 		if cfg.ImportsOnly {
@@ -47,7 +47,7 @@
 // addImportsOnlyVulns adds Vuln entries to result in imports only mode, i.e., for each vulnerable symbol
 // of pkg.
 func addImportsOnlyVulns(pkg string, symbols []string, result *Result, modVulns moduleVulnerabilities) {
-	for _, osv := range modVulns.VulnsForPackage(pkg) {
+	for _, osv := range modVulns.vulnsForPackage(pkg) {
 		for _, affected := range osv.Affected {
 			if affected.Package.Name != pkg {
 				continue
@@ -81,7 +81,7 @@
 // addSymbolVulns adds Vuln entries to result for every symbol of pkg in the binary that is vulnerable.
 func addSymbolVulns(pkg string, symbols []string, result *Result, modVulns moduleVulnerabilities) {
 	for _, symbol := range symbols {
-		for _, osv := range modVulns.VulnsForSymbol(pkg, symbol) {
+		for _, osv := range modVulns.vulnsForSymbol(pkg, symbol) {
 			for _, affected := range osv.Affected {
 				if affected.Package.Name != pkg {
 					continue
diff --git a/vulncheck/source.go b/vulncheck/source.go
index ed9698e..158f5ae 100644
--- a/vulncheck/source.go
+++ b/vulncheck/source.go
@@ -48,7 +48,7 @@
 	if err != nil {
 		return nil, err
 	}
-	modVulns = modVulns.Filter(lookupEnv("GOOS", runtime.GOOS), lookupEnv("GOARCH", runtime.GOARCH))
+	modVulns = modVulns.filter(lookupEnv("GOOS", runtime.GOOS), lookupEnv("GOARCH", runtime.GOARCH))
 
 	result := &Result{
 		Imports:  &ImportGraph{Packages: make(map[int]*PkgNode)},
@@ -132,7 +132,7 @@
 	}
 
 	// Check if pkg has known vulnerabilities.
-	vulns := modVulns.VulnsForPackage(pkg.PkgPath)
+	vulns := modVulns.vulnsForPackage(pkg.PkgPath)
 
 	// If pkg is not vulnerable nor it transitively leads
 	// to vulnerabilities, jump out.
@@ -338,7 +338,7 @@
 	}
 
 	// Check if f has known vulnerabilities.
-	vulns := modVulns.VulnsForSymbol(pkgPath(f), dbFuncName(f))
+	vulns := modVulns.vulnsForSymbol(pkgPath(f), dbFuncName(f))
 
 	var funNode *FuncNode
 	// If there are vulnerabilities for f, create node for f and
diff --git a/vulncheck/vulncheck.go b/vulncheck/vulncheck.go
index ea728a4..ab6ad8b 100644
--- a/vulncheck/vulncheck.go
+++ b/vulncheck/vulncheck.go
@@ -260,7 +260,7 @@
 	vulns []*osv.Entry
 }
 
-func (mv moduleVulnerabilities) Filter(os, arch string) moduleVulnerabilities {
+func (mv moduleVulnerabilities) filter(os, arch string) moduleVulnerabilities {
 	var filteredMod moduleVulnerabilities
 	for _, mod := range mv {
 		module := mod.mod
@@ -318,18 +318,11 @@
 	}
 	return matchesOS && matchesArch
 }
-func (mv moduleVulnerabilities) Num() int {
-	var num int
-	for _, m := range mv {
-		num += len(m.vulns)
-	}
-	return num
-}
 
-// VulnsForPackage returns the vulnerabilities for the module which is the most
+// vulnsForPackage returns the vulnerabilities for the module which is the most
 // specific prefix of importPath, or nil if there is no matching module with
 // vulnerabilities.
-func (mv moduleVulnerabilities) VulnsForPackage(importPath string) []*osv.Entry {
+func (mv moduleVulnerabilities) vulnsForPackage(importPath string) []*osv.Entry {
 	var mostSpecificMod *modVulns
 	for _, mod := range mv {
 		md := mod
@@ -360,9 +353,9 @@
 	return packageVulns
 }
 
-// VulnsForSymbol returns vulnerabilities for `symbol` in `mv.VulnsForPackage(importPath)`.
-func (mv moduleVulnerabilities) VulnsForSymbol(importPath, symbol string) []*osv.Entry {
-	vulns := mv.VulnsForPackage(importPath)
+// vulnsForSymbol returns vulnerabilities for `symbol` in `mv.VulnsForPackage(importPath)`.
+func (mv moduleVulnerabilities) vulnsForSymbol(importPath, symbol string) []*osv.Entry {
+	vulns := mv.vulnsForPackage(importPath)
 	if vulns == nil {
 		return nil
 	}
@@ -388,18 +381,3 @@
 	}
 	return symbolVulns
 }
-
-// Vulns returns vulnerabilities for all modules in `mv`.
-func (mv moduleVulnerabilities) Vulns() []*osv.Entry {
-	var vulns []*osv.Entry
-	seen := make(map[string]bool)
-	for _, mv := range mv {
-		for _, v := range mv.vulns {
-			if !seen[v.ID] {
-				vulns = append(vulns, v)
-				seen[v.ID] = true
-			}
-		}
-	}
-	return vulns
-}
diff --git a/vulncheck/vulncheck_test.go b/vulncheck/vulncheck_test.go
index 9faf00e..7c7874c 100644
--- a/vulncheck/vulncheck_test.go
+++ b/vulncheck/vulncheck_test.go
@@ -103,7 +103,7 @@
 		},
 	}
 
-	filtered := mv.Filter("linux", "amd64")
+	filtered := mv.filter("linux", "amd64")
 	if !reflect.DeepEqual(filtered, expected) {
 		t.Fatalf("Filter returned unexpected results, got:\n%s\nwant:\n%s", moduleVulnerabilitiesToString(filtered), moduleVulnerabilitiesToString(expected))
 	}
@@ -140,7 +140,7 @@
 		},
 	}
 
-	filtered := mv.VulnsForPackage("example.mod/a/b/c")
+	filtered := mv.vulnsForPackage("example.mod/a/b/c")
 	expected := []*osv.Entry{
 		{ID: "b", Affected: []osv.Affected{{Package: osv.Package{Name: "example.mod/a/b/c"}}}},
 	}
@@ -175,7 +175,7 @@
 		},
 	}
 
-	filtered := mv.VulnsForPackage("example.mod/a/b/c")
+	filtered := mv.vulnsForPackage("example.mod/a/b/c")
 	expected := []*osv.Entry{
 		{ID: "c", Affected: []osv.Affected{{Package: osv.Package{Name: "example.mod/b/c"}}}},
 	}
@@ -208,7 +208,7 @@
 		},
 	}
 
-	filtered := mv.VulnsForSymbol("example.mod/a/b/c", "a")
+	filtered := mv.vulnsForSymbol("example.mod/a/b/c", "a")
 	expected := []*osv.Entry{
 		{ID: "b", Affected: []osv.Affected{{Package: osv.Package{Name: "example.mod/a/b/c"}, EcosystemSpecific: osv.EcosystemSpecific{Symbols: []string{"a"}}}}},
 	}
