Nevermind, all of these methods work if I add the post_type parameter to the query:
get_posts(array(
'ID' => 12345,
'post_type' => array('any'),
));
get_posts(array(
'p' => 12345,
'post_type' => array('any'),
));
get_posts(array(
'post' => 12345,
'post_type' => array('any'),
));
get_posts(array(
'post__in' => array(12345),
'post_type' => array('any'),
));
This is a really stupid design decision; any post type should be assumed if the parameter is omitted.