diff --git a/Library/Homebrew/cmd/list.rb b/Library/Homebrew/cmd/list.rb
index 92941babe18c1134ffaae27357e60548cc9659d5..7ff4c37c025a1a0298c80f5bd91367e75d5b5971 100644
--- a/Library/Homebrew/cmd/list.rb
+++ b/Library/Homebrew/cmd/list.rb
@@ -20,18 +20,18 @@ module Homebrew
         List all installed formulae and casks.
 
         If <formula> is provided, summarise the paths within its current keg.
+        If <cask> is provided, list its artifacts.
       EOS
       switch "--formula", "--formulae",
-             description: "List only formulae."
+             description: "List only formulae, or treat all named arguments as formulae."
       switch "--cask", "--casks",
-             description: "List only casks, or <cask> if provided."
+             description: "List only casks, or treat all named arguments as casks."
       switch "--unbrewed",
              description: "List files in Homebrew's prefix not installed by Homebrew."
       switch "--full-name",
-             depends_on:  "--formula",
-             description: "Print formulae with fully-qualified names. If `--full-name` is not "\
-                          "passed, other options (i.e. `-1`, `-l`, `-r` and `-t`) are passed to `ls`(1) "\
-                          "which produces the actual output."
+             description: "Print formulae with fully-qualified names. Unless `--full-name`, `--versions` "\
+                          "or `--pinned` are passed, other options (i.e. `-1`, `-l`, `-r` and `-t`) are "\
+                          "passed to `ls`(1) which produces the actual output."
       switch "--versions",
              description: "Show the version number for installed formulae, or only the specified "\
                           "formulae if <formula> are provided."
@@ -39,7 +39,7 @@ module Homebrew
              depends_on:  "--versions",
              description: "Only show formulae with multiple versions installed."
       switch "--pinned",
-             description: "Show the versions of pinned formulae, or only the specified (pinned) "\
+             description: "List only pinned formulae, or only the specified (pinned) "\
                           "formulae if <formula> are provided. See also `pin`, `unpin`."
       # passed through to ls
       switch "-1",
@@ -53,14 +53,20 @@ module Homebrew
       switch "-t",
              description: "Sort formulae by time modified, listing most recently modified first."
 
+      conflicts "--formula", "--cask"
+      conflicts "--full-name", "--versions"
+      conflicts "--pinned", "--multiple"
+      conflicts "--cask", "--multiple"
+      ["--formula", "--cask", "--full-name", "--versions", "--pinned"].each do |flag|
+        conflicts "--unbrewed", flag
+      end
       ["-1", "-l", "-r", "-t"].each do |flag|
-        conflicts "--full-name", flag
         conflicts "--unbrewed", flag
-        conflicts "--pinned", flag
         conflicts "--versions", flag
+        conflicts "--pinned", flag
       end
-
-      ["--unbrewed", "--formula", "-l", "-r", "-t"].each do |flag|
+      ["--pinned", "-l", "-r", "-t"].each do |flag|
+        conflicts "--full-name", flag
         conflicts "--cask", flag
       end
     end
@@ -69,8 +75,6 @@ module Homebrew
   def list
     args = list_args.parse
 
-    return list_casks(args: args) if args.cask?
-
     if args.unbrewed?
       raise UsageError, "`--unbrewed` does not take a formula/cask argument." unless args.no_named?
 
@@ -80,35 +84,47 @@ module Homebrew
     # Unbrewed uses the PREFIX, which will exist
     # Things below use the CELLAR, which doesn't until the first formula is installed.
     unless HOMEBREW_CELLAR.exist?
-      raise NoSuchKegError, args.named.first if args.named.present?
+      raise NoSuchKegError, args.named.first if args.named.present? && !args.cask?
 
       return
     end
 
-    if args.pinned? || args.versions?
+    if args.full_name?
+      unless args.cask?
+        formula_names = args.no_named? ? Formula.installed : args.named.to_resolved_formulae
+        full_formula_names = formula_names.map(&:full_name).sort(&tap_and_name_comparison)
+        full_formula_names = Formatter.columns(full_formula_names) unless args.public_send(:'1?')
+        puts full_formula_names unless full_formula_names.blank?
+      end
+      if args.cask? || (!args.formula? && args.no_named?)
+        cask_names = if args.no_named?
+          Cask::Caskroom.casks
+        else
+          args.named.to_formulae_and_casks(only: :cask, method: :resolve)
+        end
+        full_cask_names = cask_names.map(&:full_name).sort(&tap_and_name_comparison)
+        full_cask_names = Formatter.columns(full_cask_names) unless args.public_send(:'1?')
+        puts full_cask_names unless full_cask_names.blank?
+      end
+    elsif args.cask?
+      list_casks(args: args)
+    elsif args.pinned? || args.versions?
       filtered_list args: args
     elsif args.no_named?
-      if args.full_name?
-        full_names = Formula.installed.map(&:full_name).sort(&tap_and_name_comparison)
-        return if full_names.empty?
-
-        puts Formatter.columns(full_names)
-      else
-        ENV["CLICOLOR"] = nil
+      ENV["CLICOLOR"] = nil
 
-        ls_args = []
-        ls_args << "-1" if args.public_send(:'1?')
-        ls_args << "-l" if args.l?
-        ls_args << "-r" if args.r?
-        ls_args << "-t" if args.t?
+      ls_args = []
+      ls_args << "-1" if args.public_send(:'1?')
+      ls_args << "-l" if args.l?
+      ls_args << "-r" if args.r?
+      ls_args << "-t" if args.t?
 
-        if !$stdout.tty? && !args.formula?
-          odeprecated "`brew list` to only list formulae", "`brew list --formula`"
-          safe_system "ls", *ls_args, HOMEBREW_CELLAR
-        else
-          safe_system "ls", *ls_args, HOMEBREW_CELLAR
-          list_casks(args: args) unless args.formula?
-        end
+      if !$stdout.tty? && !args.formula? && !args.cask?
+        odeprecated "`brew list` to only list formulae", "`brew list --formula`"
+        safe_system "ls", *ls_args, HOMEBREW_CELLAR
+      else
+        safe_system "ls", *ls_args, HOMEBREW_CELLAR unless args.cask?
+        list_casks(args: args) unless args.formula?
       end
     elsif args.verbose? || !$stdout.tty?
       system_command! "find", args: args.named.to_kegs.map(&:to_s) + %w[-not -type d -print], print_stdout: true