Index: src/wp-includes/class-wp-post-type.php
===================================================================
--- src/wp-includes/class-wp-post-type.php	(revision 46158)
+++ src/wp-includes/class-wp-post-type.php	(working copy)
@@ -513,7 +513,13 @@
 	 */
 	public function add_supports() {
 		if ( ! empty( $this->supports ) ) {
-			add_post_type_support( $this->name, $this->supports );
+			foreach ( $this->supports as $feature => $args ) {
+				if ( is_array( $args ) ) {
+					add_post_type_support( $this->name, $feature, $args );
+				} else {
+					add_post_type_support( $this->name, $args );
+				}
+			}
 			unset( $this->supports );
 		} elseif ( false !== $this->supports ) {
 			// Add default features.
Index: tests/phpunit/tests/post/wpPostType.php
===================================================================
--- tests/phpunit/tests/post/wpPostType.php	(revision 46158)
+++ tests/phpunit/tests/post/wpPostType.php	(working copy)
@@ -62,6 +62,47 @@
 		$this->assertEqualSets( array(), $post_type_supports_after );
 	}
 
+	/**
+	 * Test that supports can optionally receive nested args.
+	 *
+	 * @ticket 40413
+	 */
+	public function test_add_supports_custom_with_args() {
+		$post_type        = 'cpt';
+		$post_type_object = new WP_Post_Type(
+			$post_type,
+			array(
+				'supports' => array(
+					'support_with_args' => array(
+						'arg1',
+						'arg2',
+					),
+					'support_without_args',
+				),
+			)
+		);
+
+		$post_type_object->add_supports();
+		$post_type_supports = get_all_post_type_supports( $post_type );
+
+		$post_type_object->remove_supports();
+		$post_type_supports_after = get_all_post_type_supports( $post_type );
+
+		$this->assertEqualSets(
+			array(
+				'support_with_args'    => array(
+					array(
+						'arg1',
+						'arg2',
+					),
+				),
+				'support_without_args' => true,
+			),
+			$post_type_supports
+		);
+		$this->assertEqualSets( array(), $post_type_supports_after );
+	}
+
 	public function test_does_not_add_query_var_if_not_public() {
 		$this->set_permalink_structure( '/%postname%' );
 
