diff --git a/contrib/pg_upgrade/check.c b/contrib/pg_upgrade/check.c
new file mode 100644
index 1c3f589..1ee2aca
*** a/contrib/pg_upgrade/check.c
--- b/contrib/pg_upgrade/check.c
*************** static void check_for_prepared_transacti
*** 20,25 ****
--- 20,26 ----
  static void check_for_isn_and_int8_passing_mismatch(ClusterInfo *cluster);
  static void check_for_reg_data_type_usage(ClusterInfo *cluster);
  static void check_for_support_lib(ClusterInfo *cluster);
+ static void get_bin_version(ClusterInfo *cluster);
  
  
  void
*************** output_completion_banner(char *deletion_
*** 216,221 ****
--- 217,224 ----
  void
  check_cluster_versions(void)
  {
+ 	prep_status("Checking cluster versions");
+ 
  	/* get old and new cluster versions */
  	old_cluster.major_version = get_major_server_version(&old_cluster);
  	new_cluster.major_version = get_major_server_version(&new_cluster);
*************** check_cluster_versions(void)
*** 235,244 ****
  
  	/*
  	 * We can't allow downgrading because we use the target pg_dumpall, and
! 	 * pg_dumpall cannot operate on new datbase versions, only older versions.
  	 */
  	if (old_cluster.major_version > new_cluster.major_version)
  		pg_log(PG_FATAL, "This utility cannot be used to downgrade to older major PostgreSQL versions.\n");
  }
  
  
--- 238,263 ----
  
  	/*
  	 * We can't allow downgrading because we use the target pg_dumpall, and
! 	 * pg_dumpall cannot operate on new database versions, only older versions.
  	 */
  	if (old_cluster.major_version > new_cluster.major_version)
  		pg_log(PG_FATAL, "This utility cannot be used to downgrade to older major PostgreSQL versions.\n");
+ 
+ 	/* get old and new binary versions */
+ 	get_bin_version(&old_cluster);
+ 	get_bin_version(&new_cluster);
+ 
+ 	/* Ensure binaries match the designated data directories */
+ 	if (GET_MAJOR_VERSION(old_cluster.major_version) !=
+ 		GET_MAJOR_VERSION(old_cluster.bin_version))
+ 		pg_log(PG_FATAL,
+ 			   "Old cluster data and binary directories are from different major versions.\n");
+ 	if (GET_MAJOR_VERSION(new_cluster.major_version) !=
+ 		GET_MAJOR_VERSION(new_cluster.bin_version))
+ 		pg_log(PG_FATAL,
+ 			   "New cluster data and binary directories are from different major versions.\n");
+ 
+ 	check_ok();
  }
  
  
*************** check_for_support_lib(ClusterInfo *clust
*** 754,756 ****
--- 773,804 ----
  
  	fclose(lib_test);
  }
+ 
+ 
+ static void
+ get_bin_version(ClusterInfo *cluster)
+ {
+ 	char		cmd[MAXPGPATH], cmd_output[MAX_STRING];
+ 	FILE	   *output;
+ 	int			pre_dot, post_dot;
+ 
+ 	snprintf(cmd, sizeof(cmd), "\"%s/pg_ctl\" --version", cluster->bindir);
+ 
+ 	if ((output = popen(cmd, "r")) == NULL)
+ 		pg_log(PG_FATAL, "Could not get pg_ctl version data: %s\n",
+ 			   getErrorText(errno));
+ 
+ 	fgets(cmd_output, sizeof(cmd_output), output);
+ 
+ 	pclose(output);
+ 
+ 	/* Remove trailing newline */
+ 	if (strchr(cmd_output, '\n') != NULL)
+ 		*strchr(cmd_output, '\n') = '\0';
+ 
+ 	if (sscanf(cmd_output, "%*s %*s %d.%d", &pre_dot, &post_dot) != 2)
+ 		pg_log(PG_FATAL, "could not get version from %s\n", cmd);
+ 
+ 	cluster->bin_version = (pre_dot * 100 + post_dot) * 100;
+ }
+ 
diff --git a/contrib/pg_upgrade/pg_upgrade.h b/contrib/pg_upgrade/pg_upgrade.h
new file mode 100644
index c27b58a..613ddbd
*** a/contrib/pg_upgrade/pg_upgrade.h
--- b/contrib/pg_upgrade/pg_upgrade.h
*************** typedef struct
*** 184,189 ****
--- 184,190 ----
  	unsigned short port;		/* port number where postmaster is waiting */
  	uint32		major_version;	/* PG_VERSION of cluster */
  	char		major_version_str[64];	/* string PG_VERSION of cluster */
+ 	uint32		bin_version;	/* version returned from pg_ctl */
  	Oid			pg_database_oid;	/* OID of pg_database relation */
  	char	   *tablespace_suffix;		/* directory specification */
  } ClusterInfo;
