diff --git a/core/commands/pin.go b/core/commands/pin.go
index 5361a859402cf774f4c27bc6e201d46464d61da1..45f37b81521d5a4ac505ff25d66f88ce6e977164 100644
--- a/core/commands/pin.go
+++ b/core/commands/pin.go
@@ -173,6 +173,7 @@ Defaults to "direct".
 	Options: []cmds.Option{
 		cmds.StringOption("type", "t", "The type of pinned keys to list. Can be \"direct\", \"indirect\", \"recursive\", or \"all\". Defaults to \"direct\""),
 		cmds.BoolOption("count", "n", "Show refcount when listing indirect pins"),
+		cmds.BoolOption("quiet", "q", "Write just hashes of objects"),
 	},
 	Run: func(req cmds.Request, res cmds.Response) {
 		n, err := req.Context().GetNode()
@@ -197,20 +198,29 @@ Defaults to "direct".
 			res.SetError(err, cmds.ErrClient)
 		}
 
-		keys := make(map[string]int)
+		keys := make(map[string]RefKeyObject)
 		if typeStr == "direct" || typeStr == "all" {
 			for _, k := range n.Pinning.DirectKeys() {
-				keys[k.B58String()] = 1
+				keys[k.B58String()] = RefKeyObject{
+					Type:  "direct",
+					Count: 1,
+				}
 			}
 		}
 		if typeStr == "indirect" || typeStr == "all" {
 			for k, v := range n.Pinning.IndirectKeys() {
-				keys[k.B58String()] = v
+				keys[k.B58String()] = RefKeyObject{
+					Type:  "indirect",
+					Count: v,
+				}
 			}
 		}
 		if typeStr == "recursive" || typeStr == "all" {
 			for _, k := range n.Pinning.RecursiveKeys() {
-				keys[k.B58String()] = 1
+				keys[k.B58String()] = RefKeyObject{
+					Type:  "recursive",
+					Count: 1,
+				}
 			}
 		}
 
@@ -229,6 +239,11 @@ Defaults to "direct".
 				return nil, err
 			}
 
+			quiet, _, err := res.Request().Option("quiet").Bool()
+			if err != nil {
+				return nil, err
+			}
+
 			keys, ok := res.Output().(*RefKeyList)
 			if !ok {
 				return nil, u.ErrCast()
@@ -236,11 +251,19 @@ Defaults to "direct".
 			out := new(bytes.Buffer)
 			if typeStr == "indirect" && count {
 				for k, v := range keys.Keys {
-					fmt.Fprintf(out, "%s %d\n", k, v)
+					if quiet {
+						fmt.Fprintf(out, "%s\n", k, v.Count)
+					} else {
+						fmt.Fprintf(out, "%s %s %d\n", k, v.Type, v.Count)
+					}
 				}
 			} else {
-				for k, _ := range keys.Keys {
-					fmt.Fprintf(out, "%s\n", k)
+				for k, v := range keys.Keys {
+					if quiet {
+						fmt.Fprintf(out, "%s\n", k)
+					} else {
+						fmt.Fprintf(out, "%s %s\n", k, v.Type)
+					}
 				}
 			}
 			return out, nil
@@ -248,6 +271,11 @@ Defaults to "direct".
 	},
 }
 
+type RefKeyObject struct {
+	Type  string
+	Count int
+}
+
 type RefKeyList struct {
-	Keys map[string]int
+	Keys map[string]RefKeyObject
 }
diff --git a/test/sharness/t0080-repo.sh b/test/sharness/t0080-repo.sh
index 15b4ed448ef69e17a9b7b2075e7addd7c1804dc9..a4db1cebd9b526aeab22e74617786e2c945baffb 100755
--- a/test/sharness/t0080-repo.sh
+++ b/test/sharness/t0080-repo.sh
@@ -49,7 +49,7 @@ test_expect_success "file no longer pinned" '
 	echo "$HASH_WELCOME_DOCS" >expected2 &&
 	ipfs refs -r "$HASH_WELCOME_DOCS" >>expected2 &&
 	echo QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn >> expected2 &&
-	ipfs pin ls --type=recursive >actual2 &&
+	ipfs pin ls --type=recursive --quiet >actual2 &&
 	test_sort_cmp expected2 actual2
 '
 
@@ -105,6 +105,7 @@ test_expect_success "adding multiblock random file succeeds" '
 test_expect_success "'ipfs pin ls --type=indirect' is correct" '
 	ipfs refs "$MBLOCKHASH" >refsout &&
 	ipfs refs -r "$HASH_WELCOME_DOCS" >>refsout &&
+	sed -i="" "s/\(.*\)/\1 indirect/g" refsout &&
 	ipfs pin ls --type=indirect >indirectpins &&
 	test_sort_cmp refsout indirectpins
 '
@@ -122,7 +123,7 @@ test_expect_success "pin something directly" '
 '
 
 test_expect_success "'ipfs pin ls --type=direct' is correct" '
-	echo "$DIRECTPIN" >directpinexpected &&
+	echo "$DIRECTPIN direct" >directpinexpected &&
 	ipfs pin ls --type=direct >directpinout &&
 	test_sort_cmp directpinexpected directpinout
 '
@@ -132,17 +133,18 @@ test_expect_success "'ipfs pin ls --type=recursive' is correct" '
 	echo "$HASH_WELCOME_DOCS" >>rp_expected &&
 	echo QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn >>rp_expected &&
 	ipfs refs -r "$HASH_WELCOME_DOCS" >>rp_expected &&
+	sed -i="" "s/\(.*\)/\1 recursive/g" rp_expected &&
 	ipfs pin ls --type=recursive >rp_actual &&
 	test_sort_cmp rp_expected rp_actual
 '
 
-test_expect_success "'ipfs pin ls --type=all' is correct" '
+test_expect_success "'ipfs pin ls --type=all --quiet' is correct" '
 	cat directpinout >allpins &&
 	cat rp_actual >>allpins &&
 	cat indirectpins >>allpins &&
-	cat allpins | sort | uniq >> allpins_uniq &&
-	ipfs pin ls --type=all >actual_allpins &&
-	test_sort_cmp allpins_uniq actual_allpins
+	cut -f1 -d " " allpins | sort | uniq >> allpins_uniq_hashes &&
+	ipfs pin ls --type=all --quiet >actual_allpins &&
+	test_sort_cmp allpins_uniq_hashes actual_allpins
 '
 
 test_kill_ipfs_daemon