Index: wp-admin/includes/meta-boxes.php
===================================================================
--- wp-admin/includes/meta-boxes.php	(revision 18984)
+++ wp-admin/includes/meta-boxes.php	(working copy)
@@ -430,7 +430,7 @@
 		unset( $metadata[ $key ] );
 }
 list_meta( $metadata );
-meta_form(); ?>
+meta_form( $post->post_type ); ?>
 </div>
 <p><?php _e('Custom fields can be used to add extra metadata to a post that you can <a href="http://codex.wordpress.org/Using_Custom_Fields" target="_blank">use in your theme</a>.'); ?></p>
 <?php
Index: wp-admin/includes/template.php
===================================================================
--- wp-admin/includes/template.php	(revision 18984)
+++ wp-admin/includes/template.php	(working copy)
@@ -491,18 +491,24 @@
  *
  * @since 1.2.0
  */
-function meta_form() {
+function meta_form( $post_type = '' ) {
 	global $wpdb;
+
 	$limit = (int) apply_filters( 'postmeta_form_limit', 30 );
-	$keys = $wpdb->get_col( "
-		SELECT meta_key
-		FROM $wpdb->postmeta
-		GROUP BY meta_key
-		HAVING meta_key NOT LIKE '\_%'
-		ORDER BY meta_key
-		LIMIT $limit" );
+
+	$q = "SELECT meta_key FROM $wpdb->postmeta";
+
+	if ( ! empty( $post_type ) && post_type_exists( $post_type ) )
+		$q .= $wpdb->prepare( " INNER JOIN $wpdb->posts ON post_id = ID WHERE post_type LIKE %s", $post_type );
+
+	$q .= " GROUP BY meta_key HAVING meta_key NOT LIKE '\_%' ORDER BY meta_key LIMIT $limit";
+
+	$keys = $wpdb->get_col( $q );
+
+	$keys = apply_filters( 'postmeta_form_keys', $keys, $post_type );
+
 	if ( $keys )
-		natcasesort($keys);
+		natcasesort( $keys );
 ?>
 <p><strong><?php _e( 'Add New Custom Field:' ) ?></strong></p>
 <table id="newmeta">
