diff --git src/wp-admin/includes/upgrade.php src/wp-admin/includes/upgrade.php
index f8b871db49..84ffd5d359 100644
--- src/wp-admin/includes/upgrade.php
+++ src/wp-admin/includes/upgrade.php
@@ -793,6 +793,10 @@ function upgrade_all() {
 		upgrade_460();
 	}
 
+	if ( $wp_current_db_version < 43680 ) {
+		upgrade_510();
+	}
+
 	maybe_disable_link_manager();
 
 	maybe_disable_automattic_widgets();
@@ -2069,6 +2073,23 @@ function upgrade_460() {
 	}
 }
 
+/**
+ * Executes changes made in WordPress 5.1.0.
+ *
+ * @ignore
+ * @since 5.1.0
+ *
+ * @global int $wp_current_db_version Current database version.
+ */
+function upgrade_510() {
+	global $wp_current_db_version;
+
+	// Getting the cron array will automatically update it to version 3.
+	if ( $wp_current_db_version < 43680 ) {
+		_get_cron_array();
+	}
+}
+
 /**
  * Executes network-level upgrade routines.
  *
diff --git src/wp-includes/cron.php src/wp-includes/cron.php
index db3fc51601..bf20179f86 100644
--- src/wp-includes/cron.php
+++ src/wp-includes/cron.php
@@ -32,6 +32,10 @@
  * @return bool True if event successfully scheduled. False for failure.
  */
 function wp_schedule_single_event( $timestamp, $hook, $args = array() ) {
+	if ( ! is_array( $args ) ) {
+		_doing_it_wrong( __FUNCTION__, __( 'Cron arguments are expected to be an array. Please update your function call.' ), '2.1.0' );
+		$args = _cron_cast_to_array_helper( $args );
+	}
 	// Make sure timestamp is a positive integer
 	if ( ! is_numeric( $timestamp ) || $timestamp <= 0 ) {
 		return false;
@@ -149,6 +153,10 @@ function wp_schedule_single_event( $timestamp, $hook, $args = array() ) {
  * @return bool True if event successfully scheduled. False for failure.
  */
 function wp_schedule_event( $timestamp, $recurrence, $hook, $args = array() ) {
+	if ( ! is_array( $args ) ) {
+		_doing_it_wrong( __FUNCTION__, __( 'Cron arguments are expected to be an array. Please update your function call.' ), '2.1.0' );
+		$args = _cron_cast_to_array_helper( $args );
+	}
 	// Make sure timestamp is a positive integer
 	if ( ! is_numeric( $timestamp ) || $timestamp <= 0 ) {
 		return false;
@@ -214,6 +222,10 @@ function wp_schedule_event( $timestamp, $recurrence, $hook, $args = array() ) {
  * @return bool True if event successfully rescheduled. False for failure.
  */
 function wp_reschedule_event( $timestamp, $recurrence, $hook, $args = array() ) {
+	if ( ! is_array( $args ) ) {
+		_doing_it_wrong( __FUNCTION__, __( 'Cron arguments are expected to be an array. Please update your function call.' ), '2.1.0' );
+		$args = _cron_cast_to_array_helper( $args );
+	}
 	// Make sure timestamp is a positive integer
 	if ( ! is_numeric( $timestamp ) || $timestamp <= 0 ) {
 		return false;
@@ -308,6 +320,10 @@ function wp_unschedule_event( $timestamp, $hook, $args = array() ) {
 	if ( ! is_numeric( $timestamp ) || $timestamp <= 0 ) {
 		return false;
 	}
+	if ( ! is_array( $args ) ) {
+		_doing_it_wrong( __FUNCTION__, __( 'Cron arguments are expected to be an array. Please update your function call.' ), '2.1.0' );
+		$args = _cron_cast_to_array_helper( $args );
+	}
 
 	/**
 	 * Filter to preflight or hijack unscheduling of events.
@@ -493,6 +509,10 @@ function wp_unschedule_hook( $hook ) {
  * @return bool|object The event object. False if the event does not exist.
  */
 function wp_get_scheduled_event( $hook, $args = array(), $timestamp = null ) {
+	if ( ! is_array( $args ) ) {
+		_doing_it_wrong( __FUNCTION__, __( 'Cron arguments are expected to be an array. Please update your function call.' ), '2.1.0' );
+		$args = _cron_cast_to_array_helper( $args );
+	}
 	if ( ! $timestamp ) {
 		// Get the next scheduled event.
 		$timestamp = wp_next_scheduled( $hook, $args );
@@ -560,6 +580,10 @@ function wp_get_scheduled_event( $hook, $args = array(), $timestamp = null ) {
  * @return false|int The Unix timestamp of the next time the event will occur. False if the event doesn't exist.
  */
 function wp_next_scheduled( $hook, $args = array() ) {
+	if ( ! is_array( $args ) ) {
+		_doing_it_wrong( __FUNCTION__, __( 'Cron arguments are expected to be an array. Please update your function call.' ), '2.1.0' );
+		$args = _cron_cast_to_array_helper( $args );
+	}
 	/**
 	 * Filter to preflight or hijack retrieving the next scheduled event timestamp.
 	 *
@@ -872,7 +896,7 @@ function _get_cron_array() {
 		return false;
 	}
 
-	if ( ! isset( $cron['version'] ) ) {
+	if ( ! isset( $cron['version'] ) || $cron['version'] < 3 ) {
 		$cron = _upgrade_cron_array( $cron );
 	}
 
@@ -885,7 +909,7 @@ function _get_cron_array() {
  * Updates the CRON option with the new CRON array.
  *
  * @since 2.1.0
- * @since 5.0.0 Return value modified to outcome of {@see update_option}.
+ * @since 5.1.0 Return value modified to outcome of {@see update_option}.
  *
  * @access private
  *
@@ -893,7 +917,7 @@ function _get_cron_array() {
  * @return bool True if cron array updated, false on failure.
  */
 function _set_cron_array( $cron ) {
-	$cron['version'] = 2;
+	$cron['version'] = 3;
 	return update_option( 'cron', $cron );
 }
 
@@ -909,20 +933,38 @@ function _set_cron_array( $cron ) {
  * @return array An upgraded Cron info array.
  */
 function _upgrade_cron_array( $cron ) {
-	if ( isset( $cron['version'] ) && 2 == $cron['version'] ) {
+	if ( isset( $cron['version'] ) && 3 === $cron['version'] ) {
 		return $cron;
 	}
 
 	$new_cron = array();
 
 	foreach ( (array) $cron as $timestamp => $hooks ) {
-		foreach ( (array) $hooks as $hook => $args ) {
-			$key                                     = md5( serialize( $args['args'] ) );
-			$new_cron[ $timestamp ][ $hook ][ $key ] = $args;
+		foreach ( (array) $hooks as $hook => $event ) {
+			$event['args']                           = _cron_cast_to_array_helper( $event );
+			$key                                     = md5( serialize( $event['args'] ) );
+			$new_cron[ $timestamp ][ $hook ][ $key ] = $event;
 		}
 	}
 
-	$new_cron['version'] = 2;
+	$new_cron['version'] = 3;
 	update_option( 'cron', $new_cron );
 	return $new_cron;
 }
+
+/**
+ * Compatibility function for consistent casting to array of cron arguments.
+ *
+ * @since 5.1.0
+ *
+ * @access private
+ *
+ * @param mixed $args Cron arguments.
+ * @return array
+ */
+function _cron_cast_to_array_helper( $args ) {
+	if ( is_object( $args ) ) {
+		return array( $args );
+	}
+	return (array) $args;
+}
diff --git src/wp-includes/version.php src/wp-includes/version.php
index d479d97724..0d4da23167 100644
--- src/wp-includes/version.php
+++ src/wp-includes/version.php
@@ -20,7 +20,7 @@ $wp_version = '5.1-alpha-43677-src';
  *
  * @global int $wp_db_version
  */
-$wp_db_version = 42836;
+$wp_db_version = 43680;
 
 /**
  * Holds the TinyMCE version
diff --git tests/phpunit/tests/cron.php tests/phpunit/tests/cron.php
index 8b9878e53c..15a02a48a5 100644
--- tests/phpunit/tests/cron.php
+++ tests/phpunit/tests/cron.php
@@ -259,6 +259,70 @@ class Tests_Cron extends WP_UnitTestCase {
 		$this->assertFalse( wp_next_scheduled( $hook ) );
 	}
 
+	/**
+	 * Ensure cron events created without arguments as an array can be unscheduled.
+	 *
+	 * @ticket 34913
+	 *
+	 * @dataProvider data_clear_schedule_non_array_args
+	 *
+	 * @expectedDeprecated wp_clear_scheduled_hook
+	 * @expectedIncorrectUsage wp_schedule_single_event
+	 * @expectedIncorrectUsage wp_next_scheduled
+	 */
+	function test_clear_schedule_non_array_args( $args ) {
+		$hook = __FUNCTION__;
+		$timestamp = strtotime('+1 hour' );
+
+		// Schedule event with non-array arguments.
+		wp_schedule_single_event( $timestamp, $hook, $args );
+
+		// Make sure it's returned by wp_next_scheduled().
+		$this->assertEquals( $timestamp, wp_next_scheduled( $hook, $args ) );
+
+		// Make sure it was converted to an array.
+		$this->assertEquals( $timestamp, wp_next_scheduled( $hook, array( $args ) ) );
+
+		// Clear the schedule and make sure it's gone.
+		wp_clear_scheduled_hook( $hook, $args );
+		$this->assertFalse( wp_next_scheduled( $hook, $args ) );
+		$this->assertFalse( wp_next_scheduled( $hook, array( $args ) ) );
+	}
+
+	/**
+	 * Data provider for test_clear_schedule_non_array_args.
+	 *
+	 * @return array {
+	 *     @type array $0... {
+	 *         @type mixed $0 Cron arguments.
+	 *     }
+	 * }
+	 */
+	function data_clear_schedule_non_array_args() {
+		return array(
+			// Boolean
+			array( true ),
+
+			// Integer
+			array( 34913 ),
+
+			// Float
+			array( 34.913 ),
+
+			// String
+			array( 'Ticket 34913' ),
+
+			// stdClass
+			array(
+				(object) array(
+					'a' => 'Ticket 34913',
+					'b' => 34913,
+					'c' => false,
+				),
+			),
+		);
+	}
+
 	/**
 	 * @ticket 6966
 	 */
