Check is_single() outside loop

In your example, you can’t.

Per the Codex,

[is_single()] checks if a single post of any post type except attachment and page post types is being displayed.

You’re trying to use it on the transition_post_status hook, which is not related to page display, and so is_single() has no meaning.

The Solution

Instead of using is_single(), use get_post_type():

if( 'post' == get_post_type( $post ) ) {
    // code goes here
}