How to register a post type so I have archive page, but don’t have single pages?

You can force single queries to 404 like they don’t exist.

function wpse67329_force_mycpt_single_404() {
  if ( is_single() && get_post_type() == 'mycpt' ) {
    global $wp_query;
    $wp_query->set_404();
    status_header('404');
  }
}

add_action( 'template_redirect', 'wpse67329_force_mycpt_single_404' );