diff --git a/completion.go b/completion.go
index dc04b76..663ecfc 100644
--- a/completion.go
+++ b/completion.go
@@ -121,12 +121,11 @@
 	return n
 }
 
-func (c *completion) completeValue(value reflect.Value, prefix string, match string) []Completion {
-	// For slices/arrays in positional args (that take the rest of the args),
-	// complete based on the element type.
-	typ := value.Type()
-	if typ.Kind() == reflect.Array || typ.Kind() == reflect.Slice {
-		value = reflect.New(typ.Elem())
+func (c *completion) completeValue(value reflect.Value, prefix string, match string, isRemaining bool) []Completion {
+	// For remaining positional args (that are parsed into a slice), complete
+	// based on the element type.
+	if isRemaining {
+		value = reflect.New(value.Type().Elem())
 	}
 
 	i := value.Interface()
@@ -212,9 +211,9 @@
 			}
 		} else {
 			if len(s.positional) > 0 {
-				if t := s.positional[0].value.Type(); t.Kind() != reflect.Array && t.Kind() != reflect.Slice {
-					// Don't advance beyond a slice/array positional (because
-					// they consume all subsequent args).
+				if !s.positional[0].isRemaining() {
+					// Don't advance beyond a remaining positional arg (because
+					// it consumes all subsequent args).
 					s.positional = s.positional[1:]
 				}
 			} else if cmd, ok := s.lookup.commands[arg]; ok {
@@ -230,7 +229,7 @@
 
 	if opt != nil {
 		// Completion for the argument of 'opt'
-		ret = c.completeValue(opt.value, "", lastarg)
+		ret = c.completeValue(opt.value, "", lastarg, false)
 	} else if argumentIsOption(lastarg) {
 		// Complete the option
 		prefix, optname, islong := stripOptionPrefix(lastarg)
@@ -241,7 +240,7 @@
 			sname := string(rname)
 
 			if opt := s.lookup.shortNames[sname]; opt != nil && opt.canArgument() {
-				ret = c.completeValue(opt.value, prefix+sname, optname[n:])
+				ret = c.completeValue(opt.value, prefix+sname, optname[n:], false)
 			} else {
 				ret = c.completeShortNames(s, prefix, optname)
 			}
@@ -253,7 +252,7 @@
 			}
 
 			if opt != nil {
-				ret = c.completeValue(opt.value, prefix+optname+split, *argument)
+				ret = c.completeValue(opt.value, prefix+optname+split, *argument, false)
 			}
 		} else if islong {
 			ret = c.completeLongNames(s, prefix, optname)
@@ -262,7 +261,7 @@
 		}
 	} else if len(s.positional) > 0 {
 		// Complete for positional argument
-		ret = c.completeValue(s.positional[0].value, "", lastarg)
+		ret = c.completeValue(s.positional[0].value, "", lastarg, s.positional[0].isRemaining())
 	} else if len(s.command.commands) > 0 {
 		// Complete for command
 		ret = c.completeCommands(s, lastarg)
