diff --git src/wp-includes/class-wp-customize-manager.php src/wp-includes/class-wp-customize-manager.php
index ea30b93..9119e32 100644
--- src/wp-includes/class-wp-customize-manager.php
+++ src/wp-includes/class-wp-customize-manager.php
@@ -1833,8 +1833,11 @@ final class WP_Customize_Manager {
 	 * Register some default controls.
 	 *
 	 * @since 3.4.0
+	 *
+	 * @global array $_wp_additional_image_sizes
 	 */
 	public function register_controls() {
+		global $_wp_additional_image_sizes;
 
 		/* Panel, Section, and Control Types */
 		$this->register_panel_type( 'WP_Customize_Panel' );
@@ -1962,11 +1965,10 @@ final class WP_Customize_Manager {
 			'transport'      => 'postMessage',
 		) );
 
-		$this->add_control( new WP_Customize_Media_Control( $this, 'custom_logo', array(
+		$custom_logo_control_args = array(
 			'label'    => __( 'Logo' ),
 			'section'  => 'title_tagline',
 			'priority' => 8,
-			'mime_type' => 'image',
 			'button_labels' => array(
 				'select'       => __( 'Select logo' ),
 				'change'       => __( 'Change logo' ),
@@ -1976,7 +1978,20 @@ final class WP_Customize_Manager {
 				'frame_title'  => __( 'Select logo' ),
 				'frame_button' => __( 'Choose logo' ),
 			),
-		) ) );
+		);
+		$custom_logo_size = get_theme_support( 'custom-logo', 'size' );
+		if ( ! empty( $custom_logo_size ) && has_image_size( $custom_logo_size ) ) {
+			$custom_logo_control_args['width'] = $_wp_additional_image_sizes[ $custom_logo_size ]['width'];
+			$custom_logo_control_args['height'] = $_wp_additional_image_sizes[ $custom_logo_size ]['height'];
+			$custom_logo_control_args['flex_width'] = empty( $_wp_additional_image_sizes[ $custom_logo_size ]['crop'] );
+			$custom_logo_control_args['flex_height'] = empty( $_wp_additional_image_sizes[ $custom_logo_size ]['crop'] );
+		} else {
+			$custom_logo_control_args['width'] = get_option( 'medium_size_w' );
+			$custom_logo_control_args['height'] = get_option( 'medium_size_h' );
+			$custom_logo_control_args['flex_width'] = true;
+			$custom_logo_control_args['flex_height'] = true;
+		}
+		$this->add_control( new WP_Customize_Cropped_Image_Control( $this, 'custom_logo', $custom_logo_control_args ) );
 
 		if ( isset( $this->selective_refresh ) ) {
 			$this->selective_refresh->add_partial( 'custom_logo', array(
diff --git src/wp-includes/js/media-views.js src/wp-includes/js/media-views.js
index 015ec23..7be6868 100644
--- src/wp-includes/js/media-views.js
+++ src/wp-includes/js/media-views.js
@@ -402,8 +402,12 @@ CustomizeImageCropper = Controller.Cropper.extend({
 		var cropDetails = attachment.get( 'cropDetails' ),
 			control = this.get( 'control' );
 
-		cropDetails.dst_width  = control.params.width;
-		cropDetails.dst_height = control.params.height;
+		if ( ! control.params.flex_width ) {
+			cropDetails.dst_width = control.params.width;
+		}
+		if ( ! control.params.flex_height ) {
+			cropDetails.dst_height = control.params.height;
+		}
 
 		return wp.ajax.post( 'crop-image', {
 			wp_customize: 'on',
diff --git src/wp-includes/js/media/controllers/customize-image-cropper.js src/wp-includes/js/media/controllers/customize-image-cropper.js
index dbaa8f8..df2d77b 100644
--- src/wp-includes/js/media/controllers/customize-image-cropper.js
+++ src/wp-includes/js/media/controllers/customize-image-cropper.js
@@ -16,8 +16,12 @@ CustomizeImageCropper = Controller.Cropper.extend({
 		var cropDetails = attachment.get( 'cropDetails' ),
 			control = this.get( 'control' );
 
-		cropDetails.dst_width  = control.params.width;
-		cropDetails.dst_height = control.params.height;
+		if ( ! control.params.flex_width ) {
+			cropDetails.dst_width = control.params.width;
+		}
+		if ( ! control.params.flex_height ) {
+			cropDetails.dst_height = control.params.height;
+		}
 
 		return wp.ajax.post( 'crop-image', {
 			wp_customize: 'on',
